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

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

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值