我有一个来自SQL请求的数据表。虽然我确实在使用OLEDB处理表,但即使我从SQL服务器获取表,我也有同样的问题。
如果我填写数据表,然后查询数据列 - 它们都说 AllowDBNull== true 和 allowNull == true。但是,如果我查看SSMS中的表格,它会指出并非如此。
string selectStmt= "Select * from foobar; "
DataSet NewData = new DataSet();
using (SqlConnection DataConn = new SqlConnection(MyConnectionString))
{
SqlDataAdapter DataAdapter = new SqlDataAdapter(selectStmt, DataConn );
var Results = DataAdapter.Fill(NewData, tableName);
}
DataColumn Col = NewData.Tables[0].Columns[0];
// Col.AllowDBNull is always true as is Col.AllowNull
我似乎也无法弄清楚从哪里获取字符串字段的长度。
这使得在我尝试上传数据之前实现一些简单的客户端错误检查有点困难。
如果我只处理基于 SQL 服务器的表,我可以使用 Microsoft.SqlServer.Management.Sdk 和 Microsoft.SqlServer.Management.Smo。 既然我不是,那就出来了。
尝试
var Results = DataAdapter.FillSchema(NewData, SchemaType.Source, tableName);
看看这是否为您提供了所需的架构详细信息级别。
ResultSet 不会知道这样的列架构数据,每次命令执行都太密集了,相反,运行时将仅使用它在数据/结果集中返回的数据动态创建架构信息。 对于完整的架构,必须使用 EF 之类的内容或自己编写架构代码。 运行时架构唯一可以依赖的是数据类型(除非数据列专门使用其属性进行编码)。
要正确测试 DbNull,请执行以下操作:
if ( dataRow[colNameOrIndex].Value == DbNull.Value){
//null
}