有没有办法将SqlTypes与SqlDataAdapter一起使用?

时间:2010-09-10 16:25:38

标签: c# .net sql-server ado.net

我正在尝试编写一些简单的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一起使用?希望我错过了一些明显的东西。

4 个答案:

答案 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

这是正确答案。