Qual è il modo migliore per documentare le chiamate al metodo del lettore di dati? [chiuso]

StackOverflow https://stackoverflow.com/questions/439175

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.

È stato utile?

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.

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