//连接数据库
string L_SqlString = "select * from Engineering where Engineering='" + L_Engineering + "'";
OleDbDataAdapter OleDbDr = new OleDbDataAdapter(L_SqlString ,DBConnection .OleDbConnSingle );
                DataSet thisDataSet = new DataSet();
                OleDbDr.Fill(thisDataSet,"gongcheng");
//如果数据库没有记录,则增加
                if (thisDataSet.Tables["gongcheng"].Rows.Count <= 0)
                {
                    DataRow thisDataRow = thisDataSet.Tables["gongcheng"].NewRow();
                    thisDataRow["Engineering"] = L_Engineering;
                    thisDataRow["Re"] = L_Re;
                    thisDataSet.Tables["gongcheng"].Rows.Add(thisDataRow);//到下边这步,程序就提示说:当传递具有新行的 DataRow 集合时,更新要求有效的 InsertCommand。
                    OleDbDr.Update(thisDataSet ,"gongcheng");
                              
                    
                }我这个程序是参照《c#入门经典》上来的。

解决方案 »

  1.   

    还有这样增加呀?如果判断为空则直接用insert 增加不是更好?
      

  2.   

    上边的代码太乱了,整理了一下,重新发一下。
    顺便说一下,csdn的编辑器实在有点简陋,其他功能不方便增加,至少把编辑框拉宽一点啊。//连接数据库
    string L_SqlString = "select * from Engineering where Engineering='" + L_Engineering + "'";
    OleDbDataAdapter OleDbDr = new OleDbDataAdapter (L_SqlString ,DBConnection .OleDbConnSingle );//填充数据集
    DataSet thisDataSet = new DataSet();
    OleDbDr.Fill(thisDataSet,"gongcheng");
    //如果数据库没有记录,则增加
    if (thisDataSet.Tables["gongcheng"].Rows.Count <= 0)
    {
        //增加一个新行
    DataRow thisDataRow = thisDataSet.Tables["gongcheng"].NewRow();
    //为行中的字段赋值
        thisDataRow["Engineering"] = L_Engineering;
    thisDataRow["Re"] = L_Re;
    //把新行添加到表中
    thisDataSet.Tables["gongcheng"].Rows.Add(thisDataRow);//把数据更新到数据库中,/到这步,程序就出错了,提示说:当传递具有新行的 DataRow 集合时,更新要求有效的 InsertCommand。OleDbDr.Update(thisDataSet ,"gongcheng");

    这段程序是参照《c#入门经典》上来的,请大家帮忙看看是什么原因。
      

  3.   

    OleDbDataAdapter OleDbDr = new OleDbDataAdapter(L_SqlString ,DBConnection .OleDbConnSingle ); 
    OleDbCommandBuilder cb = new OleDbCommandBuilder(OleDbDr);//这样使用时需要给Engineering表设置主键
      

  4.   

    Update方法好象不能直接用,要用个OleDbCommandBuilder来生成数据库命令
      

  5.   

    使用UPDATE来自动生成SQLCOMMAND时,需要先建立CommandBuilder的实例OleDbDataAdapter da = new OleDbDataAdapter;
    OleDbCommandBuilder cb = new OleDbCommandBuilder(da)
      

  6.   

    update不配合OleDbCommandBuilder也是可以用的使用OleDbCommandBuilder的目的是为了自动生成sql语句,但有一个前提是数据表必须有主键且主键必须包含在返回的结果集中否则只要自己指定了
     da.InsertCommand.CommandText
     da.DeleteCommand.CommandText
     da.UpdateCommand.CommandText
    一样可以运行update();
      

  7.   

    在OleDbDr.Update(thisDataSet ,"gongcheng");
    前加句:OleDbCommandBuilder ocb = new OleDbCommandBuilder(OleDbDr);
    试试
      

  8.   

    private void Add_database()
        {
                treeView.Update();
                int j=this.treeView.Nodes.Count+1;
                string strConnection = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=........\Data.mdb";
                OleDbConnection objConnection = new OleDbConnection(strConnection);
               
                objConnection.Open();
                string InsertCommand = "INSERT INTO site (ID,基站名称,Longitude,Latitude,所属区) VALUES("+j+",'" + tBox1.Text + "' ," + tBox2.Text + " ," + tBox3.Text + ",'" + tBox4.Text + "')";
                OleDbCommand myOleDbCommand = new OleDbCommand(InsertCommand,objConnection );
                if(myOleDbCommand.ExecuteNonQuery()>0) 
               {
                   treeView.Nodes.Add(tBox1.Text);
                   treeView.ExpandAll();
               }
                tBox1.Text = " ";
                tBox2.Text = " ";
                tBox3.Text = " ";
                tBox4.Text = " ";
                treeView.Update();            objConnection.Close();
                treeView.ExpandAll();
                treeView.Update();
                
            }
    希望对你有帮助啊!给分哦!
      

  9.   

    TO:jiatong1981(末日之痕) Update这方法只是刚开始学的时候看书上那么说的,几乎没用过,一直用封装好的数据库操作类+存储过程~~~~~
    也算张见识咯~~~
      

  10.   

    采用了“wyhao”的答案,问题解决了,谢谢大家的回复。