有没有办法检查列是否支持来自datareader的空值?

时间:2013-12-12 07:57:51

标签: c# sqldatareader datareader dbnull mysqldatareader

db中的表的列可以存储空值(如DBNull s)。有没有办法可以从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())
    {

    }
}

我知道我可以读取单元格值并针对DBNull.Value进行检查,但我不会问我是否可以检查读取值是否为空,但是如果我可以检查如果列本身支持DBNull s ,则无论表中是否存在实际值。

我想知道MySqlDataReader和/或SqlDataReader是否可行。

3 个答案:

答案 0 :(得分:6)

IDataReader.GetSchemaTable允许这样做。它返回一个描述结果集的DataTable。查看文档以查看它返回的列(有很多列)。但不确定这个电话有多贵。我不认为它会对服务器进行往返。

它返回结果集的属性,而不是直接返回某些表的属性。如果直接从表中选择列,则属性应匹配。这不适用于计算表达式(SomeCol + 1),因为SQL Server无法通过表达式精确跟踪可空性。

答案 1 :(得分:2)

@ 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>

答案 2 :(得分:1)

由于您 正在阅读 数据(使用DbDataReader),实际上没有(尽管有其他答案),但不可靠:该列可以具有以前允许和存储的空值,以及以后禁止的空值存储 ,不用 删除已存储的空值。有时会使用这种做法,因为检查数据库约束(如NOT NULLABLE)会使数据插入速度变慢。

本质上,AllowDBNull仅在读取数据时有用,如果您已经知道该列已经永久强制执行或在任何插入后检查了NOT NULLABLE约束。

来自MSDN:

AllowDBNull: 如果使用者 可以将列 设置为空值,或者提供者无法确定使用者是否可以将列设置为空值,则进行设置。否则,不设置。列 可能包含空值 ,即使它不能设置为空值。