2010-09-10 43 views
2

我想写一些简单的C#代码,它将从SQL Server实例中选择一些数据,修改数据并将更改更新回数据库。但我很难搞清楚如何做到这一点。这里是我的代码的简化版本:有什么办法可以使用SqlTypes与SqlDataAdapter?

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

会发生什么? – womp 2010-09-10 16:34:42

+0

Whups ...没关系,我误读你的“博士”作为datareader,而不是datarow。这是行不通的。 – womp 2010-09-10 16:36:36

+0

@womp:错误'System.Data.DataRow'不包含'GetSqlString'的定义 – Bounderby 2010-09-10 16:37:59

回答

0

从womp的评论:

如果数据表已经字段列输入到的SqlString,不会投(的SqlString)博士[ “字段”]在成功那点? - womp Sep 10 at 17:11

这是正确的答案。

1

我可能是大错(只是一个声明),但我认为你需要从您的分贝值作出新的SqlString,就像这样: 我认为这会为你空的情况下工作,我没有测试过它虽然。

SqlString str = (dr["Field"] == null) ? SqlString.Null : new SqlString((string)dr["Field"]); 
someFunction(str); 
+0

+1 - 这会起作用。更大的问题是为什么你不能使用'DataAdapter.Fill()'函数来创建一个使用SqlTypes的数据表?似乎没有任何选择可以做到这一点。 – womp 2010-09-10 16:46:08

+0

这不起作用:参数'1':不能从'对象'转换为'字符串' – Bounderby 2010-09-10 16:49:43

+0

'someFunction(new SqlString((string)dr [“Field”]))' – womp 2010-09-10 16:51:59

0

尝试

​​
1

您正在寻找ReturnProviderSpecificTypes属性:如果你`dr.GetSqlString(indexOfFieldColumn)`

dataAdapter.ReturnProviderSpecificTypes = true; 
相关问题