db中的表的列可以存储空值(如DBNull
s)。有没有办法可以从IDataReader
或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
进行检查,但我不会问我是否可以检查读取值是否为空,但是如果我可以检查如果列本身支持DBNull
s ,则无论表中是否存在实际值。
我想知道MySqlDataReader
和/或SqlDataReader
是否可行。
答案 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: 如果使用者 可以将列 设置为空值,或者提供者无法确定使用者是否可以将列设置为空值,则进行设置。否则,不设置。列 可能包含空值 ,即使它不能设置为空值。