用SqlCommandBuilder更新DataSet,遇到“对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”问题,关键代码如下(C#):
........ string emailSql="select email,validFlag from emailMe"; DataSet emailAdd=new DataSet(); SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn); SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter); emailAdapter.Fill(emailAdd,"address"); myConn.Close(); ......//修改myDs数据 emailAdapter.Update(emailAdd,"address");
emailMe的结构是这样的: email nvarchar 100 validFlag int
运行这段代码,竟然出现了“对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”错误。想了一下,是因为emailMe表中没有定义主键字段,所以SqlCommandBuilder无法为SqlDataAdapter自动生成需要的UpdateCommand。修改表的定义,将email字段定义为主键问题当然可以解决,但是因为库里表太多了,逐一修改几乎不可能,有没有其他办法呢?
在网上搜了一下,发现有位网名“蓝色理想”的朋友给出了一个解决方案(http://www.blueidea.com/tech/program/2004/1761.asp),赶紧试一下:
........ string emailSql="select email,validFlag from emailMe"; DataSet emailAdd=new DataSet(); SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn); SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter); emailAdapter.Fill(emailAdd,"address"); myConn.Close(); DataTable myDt=emailAdd.Tables["address"]; myDt.PrimaryKey=new DataColumn[]{myDt.Columns["email"]}; ......//修改myDs数据 emailAdapter.Update(emailAdd,"address");
结果还是同样的问题!不知道是为什么(还在继续研究中)。无奈翻阅MSDN,发现了定义UpdateCommand的方法,结果,问题就是这样解决的:
........ string emailSql="select email,validFlag from emailMe"; DataSet emailAdd=new DataSet(); SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn); SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter); SqlCommand upCmd=new SqlCommand("update ["+strTableName+"] set validFlag=@validFlag where email=@email",myConn); upCmd.Parameters.Add("@validFlag",SqlDbType.Int,8,"validFlag"); upCmd.Parameters.Add("@email",SqlDbType.NVarChar,100,"email"); emailAdapter.UpdateCommand=upCmd; emailAdapter.Fill(emailAdd,"address"); myConn.Close(); ......//修改myDs数据 emailAdapter.Update(emailAdd,"address");
总结一下,对这样的问题,解决方法两种:
1. 修改表的定义,定义一个主键; 2. 为SqlDataAdapter指定UpdateCommand(DeleteCommand,InsertCommand应该也一样); 3. 我还不知道的其他方法,蓝色理想朋友的文章怎么看都有道理,代码也很有道理,或许我还不明白?继续学习! 
|