我正在尝试编写一些简单的C#代码,这些代码将从SQL Server实例中选择一些数据,修改数据并将更改更新回数据库。但我很难弄清楚如何做到这一点。这是我的代码的简化版本:
using (SqlConnection conn = new SqlConnection("Server=(local);Integrated Security=true;Database=master"))
{
SqlDataAdapter da = new SqlDataAdapter("SELECT ID, Field FROM test", conn);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
DataSet ds = new DataSet();
da.Fill(ds, "test");
foreach (DataRow dr in ds.Tables["test"].Rows)
{
dr["Field"] = someFunction((SqlString)dr["Field"]);
}
da.Update(ds, "test");
}
但是这段代码给了我以下错误:
System.InvalidCastException: specified cast is not valid.
因此,我将代码更改为使用string
而不是SqlString
:
dr["Field"] = someFunction((string)dr["Field"]);
但是如果我的数据中有任何空值,我会收到此错误:
System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.
我认为SqlTypes命名空间的重点是提供可以处理数据库空值的类型。如果是这种情况,为什么我不能将它们与SqlDataAdapter一起使用?希望我错过了一些明显的东西。
答案 0 :(得分:1)
我在这里可能是非常错误的(只是免责声明),但我认为您需要从db值创建一个新的SqlString,如下所示: 我认为这适用于你的空案例,我没有测试过它。
SqlString str = (dr["Field"] == null) ? SqlString.Null : new SqlString((string)dr["Field"]);
someFunction(str);
答案 1 :(得分:1)
您正在寻找ReturnProviderSpecificTypes属性:
dataAdapter.ReturnProviderSpecificTypes = true;
答案 2 :(得分:0)
尝试
dr["Field"] = someFunction(dr["Field"] is DbNull ? null : (string)dr["Field"]);
答案 3 :(得分:0)
来自womp的评论:
如果数据表的字段列类型为SqlString,那么转换(SqlString)dr [“Field”]是否会在该点成功? - womp 9月10日17:11
这是正确答案。