2009-05-28 36 views
1

「SELECT name、city、country FROM People」というクエリを呼び出すとします。一度SqlDataReaderを実行すると、SQLクエリと同じ順序で列が表示されますか?SqlDataReader列序文

つまり

私は次のコードが常に正常に動作することを頼ることができます。

SqlConnection connection = new SqlConnection(MyConnectionString); 
SqlCommand command = new SqlCommand(); 
command.Connection = connection; 
command.CommandText = "SELECT [name], [city], [country] WHERE [id] = @id"; 

try 
{ 
    connection.Open(); 
    SqlDataReader reader = command.ExecuteReader(System.Data.CommandBehavior.SingleRow); 

    if (reader.Read()) 
    { 
     // Read values. 
     name = reader[0].ToString(); 
     city = reader[1].ToString(); 
     country = reader[2].ToString(); 
    } 
} 
catch (Exception) 
{ 
    throw; 
} 
finally 
{ 
    connection.Close(); 
} 
私は列の名前の代わりに序数(リーダ[「name」を])を使用する場合

はまた、私はどのくらいのパフォーマンスを失うんか?

SqlDataReaderの列の順序の動作を説明する正式なMicrosoftの文書はありますか?

答えて

5

はいはい、SqlDataReader.GetName(ordinal)とSqlDataReader.GetOrdinal(name)を使用することもできます。

パフォーマンスに関しては、次のデータ行を取得するというオーバーヘッドに比べて、おそらく非常に重要ではないと思います。

+0

こんにちはジョシュ。迅速な返信ありがとうございます。この動作は保証されているので、私はそれに頼るべきですか、列名を使うほうがいいですか? PS - GetOrdinalの場合は、私が1行しか取得しないので、私の場合には役に立たないと思います。 – niaher

+0

はい、SqlDataReaderを使用したばかりではなく、バックアップするためのハードコアの証拠はありませんが、動作は保証されています。私は通常、列名が1列か2列でない限り、列名を使用します。なぜなら、読みにくいからです。 – Josh

+1

しかし実際には私はreader [0]、reader [1]などを使用しません。私はreader.GetString(0)、reader.GetString(1)などを使用します。 – Josh

5

私はJoshに完全に同意します。フィールドの位置は、実際にSQLクエリテキストで指定したものです。

しかし、より強力なので、私はまだ列名を使用することをお勧めします。例えば。 SQLクエリにフィールドを追加する必要がある場合はどうすればよいですか?

command.CommandText = "SELECT [name], [jobtitle], [city], [country] WHERE [id] = @id"; 

は今、突然、私は通常、データリーダーによって返されるすべての行を列挙ループの外で行う

何....位置を変更するすべてのコードを書き換える必要があり位置を決定しています各フィールドの私は、に興味がある:

int namePosition = reader.GetOrdinal("name"); 
int cityPosition = reader.GetOrdinal("city"); 

、その後、私は個々のフィールドへの迅速なアクセスを取得するには、データを扱う私のループ内でこれらの位置を使用します。そうすることで、ポジションを一度しか決めることはできませんが、データのルーピングでポジションを使用しています - 両方の世界のベスト! :-)

マルク・

4

この例では読み最も保守性と最も簡単です:

int? quantity = reader.Get<int?>("Quantity"); 
Guid token = reader.Get<Guid>("Token"); 

それは私が作成した以下の拡張メソッドに依存しています。 DBヌルチェックを実行し、フィールドが見つからなかった場合に有益なエラーメッセージを表示し、列の再整列時にブレークしません。

internal static T Get<T>(this SqlDataReader reader, string fieldName) 
{ 
    int ordinal; 
    try 
    { 
     ordinal = reader.GetOrdinal(fieldName); 
    } 
    catch (IndexOutOfRangeException) 
    { 
     throw new IndexOutOfRangeException(string.Format("Field name '{0}' not found.", fieldName)); 
    } 

    return !reader.IsDBNull(ordinal) ? (T)reader.GetValue(ordinal) : default(T); 
} 
関連する問題