【问题标题】:Is there a way to check if column supports null values from datareader?有没有办法检查列是否支持来自 datareader 的空值?
【发布时间】:2013-12-12 07:57:51
【问题描述】:

db 中表的列可以存储空值(如DBNulls)。有没有办法可以从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 进行检查,但我不是在问我是否可以检查读取值为空,而是我是否可以检查列本身支持DBNulls,与表中存在的实际值无关。

我想知道 MySqlDataReader 和/或 SqlDataReader.. 是否可以做到这一点。

【问题讨论】:

  • 对于 SqlDataReader.GetSchemaTable 方法,按以下顺序返回有关每列的元数据:... AllowDBNull ...

标签: c# sqldatareader datareader dbnull mysqldatareader


【解决方案1】:

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

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

【讨论】:

  • 模式表在结果集中每列返回一行。但是,是的,该列名为AllowDBNull。谢谢。
  • 感谢您的提醒,给了我方向。 +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&lt;T&gt; 扩展方法所必需的。

【讨论】:

  • 你也可以这样做column["AllowDBNull"]
  • @Edper 也是,只是你必须转换为布尔值。
  • 是的,顺便说一句,您可以在哪里获得您想要的代码?或者你现在能在哪里解决?
  • @Edper 我想不明白你的问题。这是我手头的问题,是的,它已经解决了。如果您的意思是我是否需要您的第二个替代方案来解决问题,那么前一个就足够了。不过我更喜欢第二个。非常感谢!
  • 这取决于你的HashSetList中的项目数,如果小于5甚至5,ListHashSet击败List之后更快。见讨论here
【解决方案3】:

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

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

来自 MSDN:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2011-12-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    相关资源
    最近更新 更多