2

db のテーブルの列には、null 値を (s として) 格納できますDBNull。またはからこの情報を取得する方法はありますIDataReaderDbDataReader?

using (var reader = command.ExecuteReader())
{
    //can I get the column info like if it supports null value if I pass the ordinal?
    reader.CheckIfSupportsNull(someIndex) ???

    while (reader.Read())
    {

    }
}

セルの値を読み取って に対してチェックできることは知っていますが、読み取った値が nullDBNull.Valueであることをチェックできるかどうかは尋ねていませんが、テーブルに存在する実際の値に関係なく、列自体がsをサポートしているかどうかをチェックできるかどうかを確認できます。DBNull

MySqlDataReaderこれがand/or SqlDataReader..で可能かどうか知りたいです。

4

3 に答える 3

6

IDataReader.GetSchemaTableそれを可能にします。DataTable結果セットを説明する を返します。ドキュメントを調べて、返される列を確認してください (多数あります)。ただし、その通話がどれほど高価かはわかりません。サーバーへの往復はないと思います。

一部のテーブルではなく、結果セットのプロパティを直接返します。ただし、テーブルから列を直接選択した場合、プロパティは一致するはずです。これは計算式 ( SomeCol + 1) では機能しません。これは、SQL Server が式を通じて null 可能性を正確に追跡しないためです。

于 2013-12-12T08:06:31.907 に答える
3

@usrの答えは私を正しい方向に向けました。私はそれを次のようにしました:

var table = reader.GetSchemaTable();
foreach (DataRow column in table.Rows) //here each row represents a column
{
    var allowsNull = column.Field<bool>("AllowDbNull"); //get it one by one here
    // similarly column.Field<string>("ColumnName") gives the name of the column
}

動作するはずです。

注:@Edperが言及しているように

var allowsNull = (bool)column["AllowDbNull"];

仕事もします。これには、拡張メソッドSystem.Data.DataSetExtensions.dllに必要な参照する必要がないという追加の利点があります。Field<T>

于 2013-12-12T08:48:51.863 に答える
1

(DbDataReader を使用して) データを読み取っているので、実際には (他の回答にもかかわらず) いいえ、確実ではありません: 列は以前に null を許可して格納し、後で既に格納されている null を削除せずに null を格納することを禁止することができます。データベースの制約 (NOT NULLABLE など) をチェックするとデータの挿入が大幅に遅くなるため、この方法が使用されることがあります。

本質的に、AllowDBNull は、列に NOT NULLABLE 制約が永続的に適用されているか、挿入後にチェックされていることが既にわかっている場合にのみ、データを読み取るときにのみ役立ちます。

MSDN から:

AllowDBNull: コンシューマーが列を null 値に設定できる場合、またはコンシューマーが列を null 値に設定できるかどうかをプロバイダーが判断できない場合に設定します。それ以外の場合は設定されません。列に null 値を設定できない場合でも、列に null 値が含まれる場合があります。

于 2015-10-17T01:21:28.330 に答える