2013-12-12 26 views
2

db中表的列可以存储空值(如DBNull s)。有没有一种方法可以从IDataReaderDbDataReader获取此信息?有没有方法来检查列是否支持来自datareader的空值?

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,但如果我可以检查柱本身无论表格中的实际值如何,均支持DBNull s

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

+1

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

回答

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"]; 

做这项工作了。这有一个额外的好处,你不需要参考Field<T>扩展方法所需的System.Data.DataSetExtensions.dll

+1

你可以像这样做'column [“AllowDBNull”]'。 – Edper

+0

@Edper是的,只是你必须将其转换为布尔值。 – nawfal

+0

是的,你能在哪里得到你想要的代码?或者你现在能够解决的地方? – Edper

6

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

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

+1

模式表在结果集中每列返回一行。但是,列名为'AllowDBNull'。谢谢。 – usr

+0

感谢您的领导,给了我方向。 + 1-ED。为了完整性,我会接受我的答案。顺便说一句,我更喜欢得到结果集的列信息,而不是表本身,所以没有问题。我认为表达式中的列信息在可空性方面或多或少是准确的,但琐碎的罕见情况并不是一个大问题。 – nawfal

1

既然你是阅读数据(使用的DbDataReader),那么实际上没有(尽管其他的答案),不可靠:列可以预先已允许和存储空,后来禁空存储没有删除已存储的空值。有时使用这种做法是因为检查数据库约束(如NOT NULLABLE)会使插入数据的速度变慢。

从本质上讲,AllowDBNull仅在读取数据时有用,如果您已经知道列已经具有NOT NULLABLE约束,则永久实施或在任何插入后检查。

从MSDN:

AllowDBNull: 设置如果消费者可以设置栏为空值,或者如果供应商不能确定消费者是否可以将列设置为空值。否则,不设置。列可能包含空值,即使它不能被设置为空值。

+0

尼斯边缘案例,谢谢。 – nawfal

相关问题