1. ホーム
  2. c#

[解決済み】SqlDataReader オブジェクトのカラム名を確認する

2022-04-05 04:54:21

質問

にカラムが存在するかどうかを確認するには、どうすればよいですか? SqlDataReader オブジェクトを作成できますか? データアクセスレイヤーで、複数のストアドプロシージャーの呼び出しに対して同じオブジェクトを構築するメソッドを作成しました。 ストアドプロシージャの1つは、他のストアドプロシージャでは使用されない追加のカラムを持っています。 私は、すべてのシナリオに対応するためにメソッドを変更したい。

私のアプリケーションはC#で書かれています。

どのように解決するのですか?

public static class DataRecordExtensions
{
    public static bool HasColumn(this IDataRecord dr, string columnName)
    {
        for (int i=0; i < dr.FieldCount; i++)
        {
            if (dr.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
                return true;
        }
        return false;
    }
}

使用方法 Exception を制御ロジックに使用することは、他の回答のように バッドプラクティスと考えられている であり、パフォーマンスが犠牲になります。また、プロファイラに # 例外が発生したと誤検出される可能性もありますし、例外が発生したときにデバッガがブレークするように設定している人は大変です。

GetSchemaTable() もまた、多くの回答で提案されています。これは、すべてのバージョンで実装されているわけではない(抽象的で、dotnetcoreのいくつかのバージョンではNotSupportedExceptionを投げる)ので、フィールドが存在するかどうかをチェックする方法として推奨されるものではありません。また、GetSchemaTableはパフォーマンス的にも過剰な機能です。 ソースを確認する .

フィールドをループすることは、それを頻繁に使用する場合、若干のパフォーマンスヒットをもたらす可能性があり、結果をキャッシュすることを検討した方がよいでしょう。