この構文を使用してSqlDataReaderから値を読み取ることの違いは何ですか。
Dim reader As SqlClient.SqlDataReader
reader("value").ToString()
また
Dim reader As SqlClient.SqlDataReader
reader.GetString(reader.GetOrdinal("value"))
この構文を使用してSqlDataReaderから値を読み取ることの違いは何ですか。
Dim reader As SqlClient.SqlDataReader
reader("value").ToString()
また
Dim reader As SqlClient.SqlDataReader
reader.GetString(reader.GetOrdinal("value"))
GetOrdinal() を使用する理由は、結果をキャッシュしてパフォーマンスのために複数回再利用できるようにするためだと思います。
例えば
Dim reader As SqlClient.SqlDataReader
int valueOrdinal = reader.GetOrdinal("value");
while ( ... )
{
var value = reader.GetString(valueOrdinal);
}
GetOrdinal
最初に大文字と小文字を区別してルックアップを実行します。失敗すると、大文字と小文字を区別しない 2 回目の検索が行われます。GetOrdinal
序数ベースのルックアップは名前付きルックアップよりも効率的でGetOrdinal
あるため、ループ内で呼び出すのは非効率的です。一度呼び出しGetOrdinal
て、ループ内で使用する整数変数に結果を代入することで、時間を節約します。
ソース: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx
単一の行を返す場合、これら2つのパフォーマンスの違いは重要ではないため、予想されるレコードの数のコンテキストが大きな役割を果たすことを付け加えたいと思います。ただし、多くの行をループしている場合は、最適化されているため、型指定されたアクセサーを使用する方がパフォーマンスが向上します。その場合、列名を使用して最高のパフォーマンスを得る必要がある場合は、GetOrdinal を 1 回呼び出し、それを変数に入れてから、型指定されたアクセサーをループ内の列の序数と共に使用します。これにより、最高のパフォーマンスが得られます。
パフォーマンスの違いに興味がある場合は、私のブログ投稿をチェックしてください