对于不返回任何键列信息的SelectCommand,不支持UpdateCommand 的动态SQL生成

来源:互联网 发布:网络生鲜农产品ppt 编辑:程序博客网 时间:2024/06/11 21:12

        用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),应该是没有问题的,本人小菜,还没弄明白,望高手给予解答。