Qual è il modo migliore per documentare le chiamate al metodo del lettore di dati? [chiuso]
-
22-07-2019 - |
Domanda
Quando si lavora con spazi dei nomi come System.Data.Odbc o System.Data.OracleClient, i vari metodi di lettura dei dati richiedono generalmente che alle funzioni venga fornito un numero intero corrispondente a una colonna (ad es. OracleDataReader.GetInt32 ).
La mia domanda è questa: qual è il modo migliore di lavorare con queste funzioni in modo che il codice sia abbastanza auto-documentato. In questo momento, mi sembra che ci siano tre opzioni, vale a dire:
// Option One - Just provide the integer value
string myString = oraData.GetString[0];
// Option Two - Provide the integer value using a constant
string myString = oraData.GetString[FIELD_NAME];
// Option Three - Provide the column name and use System.Convert to return the correct value
string myString = Convert.ToString(oraData["Field_Name"]);
Ognuna di queste tecniche sembra avere i suoi pro e contro e sono curioso di vedere cosa pensano gli altri, o se c'è un modo migliore per farlo.
Soluzione
Sono d'accordo con Andrew Hare, con l'aggiunta che ho racchiuso la funzionalità in un metodo di estensione sovraccarico che semplifica l'operazione:
public static string GetStringByName(this OracleDataReader reader,
string columnName,
string defaultValue)
{
string result = defaultValue;
int columnIndex = reader.GetOrdinal(columnName);
if(!reader.IsDbNull(columnName)
{
result = (string) reader.GetString(columnIndex);
}
return result;
}
Comunque, solo un refactoring che mi ha aiutato moltissimo.
Altri suggerimenti
L'ho sempre fatto in questo modo:
int columnIndex = dataReader.GetOrdinal("field");
if (!dataReader.IsDBNull(columnIndex))
String myString = dataReader.GetString(columnIndex);
L'idea è che GetOrdinal
fallirà con un IndexOutOfRangeException
quando provo a ottenere un campo che non è nel lettore. Voglio questa eccezione perché mi dice rapidamente che c'è una discrepanza tra il mio codice e il mio DB.
Anche GetOrdinal
è molto meno fragile che codificare l'ordinale stesso come un numero magico.
Di solito uso l'opzione 3. Mi piace perché se la query sottostante cambia l'ordine delle colonne funzionerà comunque e mostrerà il nome di ciò che stai chiedendo proprio lì piuttosto che un numero magico.
Tuttavia, utilizzo molto VB.Net, quindi la parte Convert.ToString ()
può essere eseguita in modo implicito. I tipi C # potrebbero avere una preferenza diversa.
Inoltre, c'è una penalità molto piccola per l'utilizzo del nome del campo piuttosto che una colonna ordinale. Normalmente ritengo che sia giustificato, ma a seconda della tua app potresti voler tenerne conto.