0

System.Data.Odbc や System.Data.OracleClient などの名前空間を使用する場合、通常、さまざまなデータ リーダー メソッドでは、列に対応する整数を関数に提供する必要があります (例: OracleDataReader.GetInt32 )。

私の質問はこれです。コードがかなり自己文書化されるように、これらの関数を操作する最良の方法は何ですか。現時点では、次の 3 つのオプションがあるように思われます。

// 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"]);

これらの手法にはそれぞれ長所と短所があるようで、他の人がどう思うか、またはそれを行うより良い方法があるかどうかに興味があります.

4

3 に答える 3

2

私はいつもこのようにしてきました:

int columnIndex = dataReader.GetOrdinal("field");

if (!dataReader.IsDBNull(columnIndex))
    String myString = dataReader.GetString(columnIndex);

リーダーにないフィールドを取得しようとGetOrdinalすると失敗するという考えです。IndexOutOfRangeExceptionコードと DB の間に不一致があることがすぐにわかるので、この例外が必要です。

またGetOrdinal、序数自体をマジック ナンバーとしてハードコーディングするよりもはるかに脆弱ではありません。

于 2009-01-13T14:52:02.033 に答える
1

私は通常、オプション 3 を使用します。基になるクエリが列の順序を変更した場合でも機能し、マジック ナンバーではなく、求めているものの名​​前が表示されるため、気に入っています。

ただし、VB.Net を多用しているため、そのConvert.ToString()部分は暗黙的に実行できます。C# の型には、異なる設定がある場合があります。

また、列の序数ではなくフィールド名を使用すると、非常に小さなペナルティがあります。通常は正当だと思いますが、アプリによってはそれを考慮したい場合があります。

于 2009-01-13T14:50:53.267 に答える
1

アンドリュー・ヘアに同意します。操作を簡素化するオーバーロードされた拡張メソッドに機能を含めたことを追加します。

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;
}

とにかく、私を大いに助けてくれたリファクタリングだけです。

于 2009-01-13T15:38:25.650 に答える