2015-04-16 54 views
4

我有一个来自SQL请求的数据表。虽然我真的在使用OLEDB工作,但即使我从我的SQL服务器获取表格,我也遇到了同样的问题。C# - 如何判断DataColumn是否支持空值?

如果我填充数据表,然后查询DataColumns - 他们都说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 Server的表,我可以使用Microsoft.SqlServer.Management.Sdk和Microsoft.SqlServer.Management.Smo。由于我不是,那已经结束了。

+0

要说清楚的是,当你说“但是如果我在MS SQL SMS中查看表格时,它会指出其他情况”,你说列的SQL不允许NULL('NOT NULL')服务器定义? – DWright

+0

是的 - SQL定义清楚地表明,有些是有的,有些则不是 - 但是当查看数据表列时,每列都说明支持空值。 – JustMeToo

回答

2

尝试

var Results = DataAdapter.FillSchema(NewData, SchemaType.Source, tableName); 

看看,让你的架构细节,你所需要的水平。

+0

这样做!结果看起来几乎与我所得到的一样,但在这种情况下,MaxLength和allowNull设置正确!可能还有一些其他的。谢谢! – JustMeToo

1

ResultSet不会像那样知道列模式数据,每次执行命令时都会执行过多的操作,相反,运行时将仅使用它返回的数据即时创建模式信息数据/结果集。对于全面的模式,你必须使用类似EF的代码或者自己编写模式。运行时模式的唯一依赖是数据类型(除非数据列是用它们的属性专门编码的)。

要正确测试的DBNull你这样做:

if (dataRow[colNameOrIndex].Value == DbNull.Value){ 
    //null 
} 
+0

1)请参阅前面提供架构的响应,完全按照我需要的方式。 2)你的方法并不告诉我列是否允许空值。它只让我知道当前值是否为空。 – JustMeToo

+0

我明白,但是在adhoc调用期间,获取该模式是一个错误,每次调用操作都会太昂贵。如果我把你的问题看作“我如何得到一个表格模式”,我会用相同的答案作出回答,但我读到了你的问题,因为我如何在一次通话中使用。 –

相关问题