用SqlCommandBuilder更新DataSet,遇到“对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”问题,关键代码如下(C#):
string connectionString = "Data Source=127.0.0.1;Initial Catalog=Test;Persist Security Info=True;User ID=sa;Password=1234";
string commandString = "SELECT * FROM tbl_Option";
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = commandString;
SqlDataAdapter dataAdapter = new SqlDataAdapter();//构造SqlDataAdapter
dataAdapter.SelectCommand = cmd;//与sql命令对象绑定,这个必不可少
SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter);
DataSet ds = new DataSet();
dataAdapter.Fill(ds, "Option1");
con.Close();
ds.Tables["Option1"].Rows[0][1]="张三";
dataAdapter.Update(ds, "Option1");
运行这段代码,竟然出现了“对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”错误。
网上查了一下资料说是没有定义主键,可如果数据库表有很多个,那数据库中表就需要改动的地方太多了,有没有其它方法呢
网上给了一个方法,我这边测试是成功的
关键代码如下:
……………………
DataSet ds = new DataSet();
SqlCommand upCmd = new SqlCommand("update tbl_Option set OptionName=@OptionName where OptionID=@OptionID", con);
upCmd.Parameters.Add("@OptionID", SqlDbType.Int, 8, "OptionID");
upCmd.Parameters.Add("@OptionName", SqlDbType.NVarChar, 50, "OptionName");
dataAdapter.DeleteCommand = upCmd;
dataAdapter.Fill(ds, "Option1");
con.Close();
ds.Tables["Option1"].Rows[0][1]="张三";
dataAdapter.Update(ds, "Option1");
……………………
总结一下,对这样的问题,解决方法两种:
1. 修改表的定义,定义一个主键;
2. 为SqlDataAdapter指定UpdateCommand(DeleteCommand,InsertCommand应该也一样);
3. 其它方法(在网上搜了一下,发现有位网名“蓝色理想”的朋友给出了一个解决方案(http://www.blueidea.com/tech/program/2004/1761.asp),应该是没有问题的,本人小菜,还没弄明白,望高手给予解答。