20

この構文を使用してSqlDataReaderから値を読み取ることの違いは何ですか。

Dim reader As SqlClient.SqlDataReader
reader("value").ToString()

また

Dim reader As SqlClient.SqlDataReader
reader.GetString(reader.GetOrdinal("value"))
4

4 に答える 4

16

GetOrdinal() を使用する理由は、結果をキャッシュしてパフォーマンスのために複数回再利用できるようにするためだと思います。

例えば

Dim reader As SqlClient.SqlDataReader
int valueOrdinal = reader.GetOrdinal("value");
while ( ... )
{
    var value = reader.GetString(valueOrdinal);
}
于 2009-07-03T13:33:58.327 に答える
8

GetOrdinal最初に大文字と小文字を区別してルックアップを実行します。失敗すると、大文字と小文字を区別しない 2 回目の検索が行われます。GetOrdinal序数ベースのルックアップは名前付きルックアップよりも効率的でGetOrdinalあるため、ループ内で呼び出すのは非効率的です。一度呼び出しGetOrdinalて、ループ内で使用する整数変数に結果を代入することで、時間を節約します。

ソース: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx

于 2009-07-03T13:34:57.030 に答える
3

単一の行を返す場合、これら2つのパフォーマンスの違いは重要ではないため、予想されるレコードの数のコンテキストが大きな役割を果たすことを付け加えたいと思います。ただし、多くの行をループしている場合は、最適化されているため、型指定されたアクセサーを使用する方がパフォーマンスが向上します。その場合、列名を使用して最高のパフォーマンスを得る必要がある場合は、GetOrdinal を 1 回呼び出し、それを変数に入れてから、型指定されたアクセサーをループ内の列の序数と共に使用します。これにより、最高のパフォーマンスが得られます。

パフォーマンスの違いに興味がある場合は、私のブログ投稿をチェックしてください

于 2012-12-20T02:06:50.110 に答える