2

db 中表的列可以存储空值(如DBNulls)。有没有办法可以从IDataReaderor获取这些信息DbDataReader

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,但我不是在询问是否可以检查读取的值为 null,而是是否可以检查列本身是否支持DBNulls而与表中存在的实际值无关。

我想知道这是否可能与MySqlDataReader和/或SqlDataReader..

4

3 回答 3

6

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

它返回结果集的属性,而不是直接返回某个表的属性。但是,如果您直接从表中选择列,则属性应该匹配。这对计算表达式 ( SomeCol + 1) 不起作用,因为 SQL Server 不会通过表达式精确跟踪可空性。

于 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),因此实际上没有(尽管有其他答案),这并不可靠:该列可以先前允许和存储空值,然后在删除已存储空值的情况下存储禁止空值。有时会使用这种做法,因为检查数据库约束(如 NOT NULLABLE)会使插入数据的速度慢得多。

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

来自 MSDN:

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

于 2015-10-17T01:21:28.330 回答