none
使用OleDbDataAdapter更新数据提示语法错误 RRS feed

  • 问题

  •         private void button2_Click(object sender, EventArgs e)
            {
                //数据库链接
                openconnection();
                string str = "select * from stu";
                OleDbDataAdapter da = new OleDbDataAdapter(str, conn);
                DataSet ds = new DataSet();
                da.Fill(ds,"stu");
                ds.Tables[0].Rows[1]["name"] = textBox2.Text;
                ds.Tables[0].Rows[3]["english"] = textBox3.Text;
                ds.Tables[0].Rows[4]["comp"] = textBox4.Text;
                ds.Tables[0].Rows[5]["manth"] = textBox5.Text;
                ds.Tables[0].Rows[6]["yuwen"] = textBox6.Text;
                ds.Tables[0].Rows[7]["weiji"] = textBox7.Text;
                OleDbCommandBuilder cmd = new OleDbCommandBuilder(da);
                da.Update(ds.Tables[0]);
                //关闭数据库链接
                closeconnection();
            }
    运行的时候提示:
    da.Update(ds.Tables[0]);
    UPDATE 语句的语法错误.

    我不明白哪里错了,是不是我从开始理解就错了呢?
    2010年2月19日 11:01

答案

  • 你这个代码写得很神奇呀!

    1) 你前面获取数据用了da.Fill(ds, "stu"); 为什么后面赋值语句用ds.Tables[0] 而不是ds.Tables["stu"] ??? 如果DataSet 只有一张表,那么两种写法是等价的,如果DataSet 有多张表,ds.Tables["stu"] 是不是更严谨一些呢?

    2) 按照你的赋值代码的写法,你是分别给结果集的第2、4、5、6、7、8 行数据的“name” “english” “comp” “manth” “yuwen” “weiji” 列赋值, 是什么逻辑需要如此怪异的数据修改呢??? 你确认业务逻辑没问题?

    3) 你明明有一行 OleDbCommandBuilder cmd = new OleDbCommandBuilder(da); 代码,可是你并没有用cmd 对象去为你的OleDataAdapter 创建Update 命令对象啊!?   这也是你Update 时报错的主要原因!!

    由于你的DataAdapter 对象是自己new 的,因此,你必须自己构造 SELECT DELETE UPDATE INSERT 的语句,当然如果你只是从数据库获取数据,有一个SELECT command 对象就可以了,但是如果你要更新数据就必须有后面三个command 对象。 因为你没有构建后面的三个对象,所以在执行更新操作时报告了语法错误。

    最简单的解决方法是,在窗体设计器界面,从Toolbox 中拖拽一个OleDbDataAdapter 对象,然后配置这个Adapter 对象,这样Visual Studio 会为你生成你所需的全部SQL 语句。
    较复杂的方法就是用你创建好的OleDbCommandBuilder 对象cmd, 为你的OleDbDataAdapter 对象创建UPDATE INSERT 和DELETE SQL 语句对象。

    2010年2月19日 14:01

全部回复

  • 你这个代码写得很神奇呀!

    1) 你前面获取数据用了da.Fill(ds, "stu"); 为什么后面赋值语句用ds.Tables[0] 而不是ds.Tables["stu"] ??? 如果DataSet 只有一张表,那么两种写法是等价的,如果DataSet 有多张表,ds.Tables["stu"] 是不是更严谨一些呢?

    2) 按照你的赋值代码的写法,你是分别给结果集的第2、4、5、6、7、8 行数据的“name” “english” “comp” “manth” “yuwen” “weiji” 列赋值, 是什么逻辑需要如此怪异的数据修改呢??? 你确认业务逻辑没问题?

    3) 你明明有一行 OleDbCommandBuilder cmd = new OleDbCommandBuilder(da); 代码,可是你并没有用cmd 对象去为你的OleDataAdapter 创建Update 命令对象啊!?   这也是你Update 时报错的主要原因!!

    由于你的DataAdapter 对象是自己new 的,因此,你必须自己构造 SELECT DELETE UPDATE INSERT 的语句,当然如果你只是从数据库获取数据,有一个SELECT command 对象就可以了,但是如果你要更新数据就必须有后面三个command 对象。 因为你没有构建后面的三个对象,所以在执行更新操作时报告了语法错误。

    最简单的解决方法是,在窗体设计器界面,从Toolbox 中拖拽一个OleDbDataAdapter 对象,然后配置这个Adapter 对象,这样Visual Studio 会为你生成你所需的全部SQL 语句。
    较复杂的方法就是用你创建好的OleDbCommandBuilder 对象cmd, 为你的OleDbDataAdapter 对象创建UPDATE INSERT 和DELETE SQL 语句对象。

    2010年2月19日 14:01
  • 谢谢,这个代码是我从别处复制之后修改的,我之前没用过这种方法,再次谢谢你的回答!
    2010年2月19日 15:53