Domanda

Ehi ragazzi, lavorando con asp.NET e c #, sto usando il connettore MySQL / il plug-in NET per connettersi a un db MySQL (senza sorprese lì!).

E funziona benissimo, può connettersi, eseguire query ecc. ecc. tutto bene e dandy, ma è possibile restituire un Hashtable o simile dei risultati? Salvare l'esecuzione di una descrizione sulla stessa tabella per ottenere i nomi delle colonne e utilizzare quei valori per creare ogni volta l'hash.

Grazie,

Psy

È stato utile?

Soluzione

Il connettore MySQL C / C ++ che presumo sia racchiuso in C # (rispetto alla reimplementazione in C #) restituisce un array a due demoni contenente i risultati. Questi sono solo i dati di colonna e riga, non il nome della colonna. L'API restituisce anche un valore di campo (nome colonna) tramite mysql_fetch_field_direct () - una chiamata di funzione separata dopo aver ottenuto i risultati della query. Anche questa è una matrice bidirezionale. Il connettore stesso non contiene API per l'unione dei due risultati separati (nomi colonna + dati colonna / riga) in una tabella hash.

Invece di fare una seconda query per ottenere i nomi delle colonne, tutto ciò che devi fare è chiamare mysql_fetch_field_direct () per ogni colonna mentre avanzi nell'assegnazione dei valori. Questo ti dà il nome del campo insieme ai dati contenuti in quella colonna / riga. A questo punto dipende dallo sviluppatore come organizzare quei dati come archiviarli in una tabella hash, ecc.

Uso una funzione di supporto come wrapper per l'esecuzione di query che memorizza ogni riga in un albero binario con il nome della colonna come chiave e restituisce un elenco di alberi collegati per fare ciò di cui ho bisogno.

Altri suggerimenti

in .net ottieni solo set di dati e set di dati, un datatable è fatto di datarows, quelli sono molto simili agli hashtable e nella maggior parte dei casi puoi usarli per eseguire le attività, ma se hai bisogno di hashtable puoi usare questo codice

public static Hashtable convertDataRowToHashTable(DataRow dr)
{
    if (dr == null)
    {
        return null;
    }

    Hashtable ret = new Hashtable(dr.Table.Columns.Count);

    for (int iColNr = 0; iColNr < dr.Table.Columns.Count; iColNr++)
    {
        ret[dr.Table.Columns[iColNr].ColumnName] = dr[iColNr];
    }
    return ret;
}

l'altra direzione (dalla tabella al datrow) non è così semplice, poiché datarow non ha un costruttore pubblico (in base alla progettazione) e devi chiamare newRow = myDataTable.NewRow (); per ottenere una nuova istanza di una riga e quindi puoi lavorare con la riga quasi come con la tabella hash

newRow["column1"]="some value";

ma se hai bisogno di una nuova colonna nella tabella hash dovrai aggiungere la colonna al datatable e non alla riga di dati myTable.Columns.Add (" name " ;, " type ");

spero che questo aiuti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top