Come dovrei fare riferimento alle colonne associate ai dati?

3

Lavoro spesso con applicazioni legate ai dati con WinForms; i record vengono estratti da un database e aggiornati in un'applicazione client che scrivo. Le stored procedure vengono utilizzate per tutte le transazioni di database nel client.

Ho bisogno di fare riferimento a livello di codice alle colonne del database, ad esempio per formattare un valore in dollari.

resultsTable.Columns[<index>].DefaultCellStyle.Format  = "$0.00"

Non apprezzo strongmente l'uso di indici interi codificati.
Ho giocato con le enumerazioni, in questo modo:

enum Columns
    {
        ID,
        OrderID,
        Notes,
        CustomerName,
        AssembledBy,
        Status,
        CreateDate
    }

Ma facendo questo, devo sempre fare un cast esplicito resultsTable.Columns[(int)Columns.CreateDate]
e devo aggiornare l'enumerazione se la procedura memorizzata cambia.

Posso fare riferimento alle colonne per nome resultsTable.Columns["create_date"] . Questo è facile da leggere ma sembra molto fragile.

Qual è un buon modo per fare riferimento alla colonna che sto cercando? Mi piacerebbe un modo dinamico per ottenere gli indici delle colonne, ma non so da dove iniziare.

    
posta christophos 13.06.2016 - 22:28
fonte

2 risposte

2

La maggior parte dei database dispone di tabelle che memorizzano le informazioni sullo schema relative alle tabelle che vengono mantenute. Ad esempio, in SQL Server:

SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @Table ORDER BY COLUMN_NAME

Verrà visualizzato un elenco di colonne per una tabella specifica.

Tuttavia, nel tuo caso, vorrei solo creare un elenco di costanti stringa per ogni nome di colonna. Fai riferimento alle tue colonne per nome.

public const string Name_Of_Column_Goes_Here = "NameOfColumn";

Quindi nel codice si fa riferimento alla stringa costante. Se il nome della colonna cambia, è necessario aggiornare la costante e quindi tale propagazione si propagherà attraverso il codice. È meglio che mantenere indici o enumerazione di indici.

    
risposta data 13.06.2016 - 22:57
fonte
0

Sono abbastanza sicuro che iterano sempre in ordine
Se non usi l'ordinale
Esiste un DataType se si dispone di un formato standard per un tipo
Il dizionario non sarà la sintassi più semplice ma sarà il più veloce

Dictionary<string, int> dicColMap = new Dictionary<sting, int>();
foreach(DataColumn column in table.Columns)
{
    Console.WriteLine(column.ColumnName);
    Console.WriteLine(column.Ordinal);
    Console.WriteLine(column.DataType);
    dicCo,Map.Add(column.ColumnName, column.Ordinal);
}
    
risposta data 13.06.2016 - 22:50
fonte

Leggi altre domande sui tag