我在做一个winform项目,要求两个版本,一个access数据库版本,一个sql数据库版本。在sql中的treeview添加和删除节点都没问题。但是同样的代码在access数据库中,我首次添加n个节点,这些新增的节点是可以删除的,当我删除新增节点之后,再次增加新节点,然后执行删除,则会报错。断点之后发现dtrow.Delete()之后,try{updata(dataset);···处不能updata。删除节点代码如下:···
foreach (DataRow dtrow in yiqiDataSet.Tables["db_zubie"].Rows)
{······
dtrow.Delete();
···
}
try
{
    db_zubieTableAdapter.Update(yiqiDataSet); 
    ··初始化TreeView节点··
    this.yiqiDataSet.AcceptChanges();
}
catch
{···}
finlly
{···}
//新增节点的代码如下:DataRow insertRow = yiqiDataSet.Tables["db_zubie"].NewRow();
{
··
  int bb = 0;
  foreach (DataRow datarow1 in yiqiDataSet.Tables["db_zubie"].Rows)//取zongheid中最大的数
  {
   int aa = Convert.ToInt32(datarow1.ItemArray[0]);
   if (aa > bb)
   {
         bb = aa;
    }
}int nodecount = bb + 1;
insertRow["id"] = nodecount;
insertRow["parent1id"] = treeView1.SelectedNode.Name;//父节点}try
{
     yiqiDataSet.Tables["db_zubie"].Rows.Add(insertRow);
      ··初始化TreeView节点··
     this.yiqiDataSet.AcceptChanges();
}
····代码太长 因为判断的条件太多,我就把主要的给粘贴出来了。请大家帮帮忙吧,困扰很久了。论坛和百度查了很久,也问了很久,没结果···最后的希望了··

解决方案 »

  1.   

    db_zubieTableAdapter的初始化估计有问题,如果你是自己写更新命令,那么应该不会出什么问题,但是如果你是自动生成(这里看不出,被你省略了关键),那么问题就会出现。数据库不一样,自动产生的SQL脚本也不会一样,出现问题也就可想而知了。
     此消息通过 【CSDN论坛 Winform测试版】 回复!
      

  2.   

    代码太长不好意思没看就回复了,Access与SQL语法是有稍许不同的,还有SQL的很多方法Access也是没有的,自已把语句复制出来放查询分析器里比较下就知道了
      

  3.   


    是自动生成的, 我没写updata 和 delect的语句,用了VS自带的updata更新。
      

  4.   

    没有报任何错,try{updata}的时候,到updata 就跳过去try中updata之后的了,然后就catch了
      

  5.   

      catch (Exception ex)
            { 
    Response.write(ex.tostring());
            }看看页面输出的是什么?
      

  6.   

    把你的SQL语句贴出来。
    ACCESS的UPDATE要求SQL语句及数据集DATA中必须包含键列信息,如果你的SQL和数据集中的列不包括主键或索引,则无法用UPDATE进行插入、删除、更新
      

  7.   


    违反并发性:DwleteCommand 影响了预期1条记录中的0条
      

  8.   


    我没对updata 和delect insert 写任何操作语句,是winform项目,使用的是默认的updata(dataset),dtrow.delect(),等形式更新的dataset。
      

  9.   

    违反并发性:DwleteCommand 影响了预期1条记录中的0条
    你的列数据是不是有规则,如不能为空。
    如果有规则,你能用Insert插入新记录,但不能用UPDATE
      

  10.   

    dataset是怎么来的,前面提取数据绑定节点是不是要从数据库中提取数据
    你的树叉、节点是否绑定数据
    没有绑定你又是以怎样的方法更新数据库
      

  11.   

    只有第一列id有规则,不能为空,但是其他都是可以为空的,我没有用insert,insert我想是我使用了,yiqiDataSet.Tables["db_zubie"].Rows.Add(insertRow);之后,系统自动调用的。主要是再次删除第二次添加的内容的时候,会报这个 “违反并发性:DwleteCommand 影响了预期1条记录中的0条
    ”错误。
      

  12.   


    在sql中 这些语句没问题,数据库用access的时候才会出错,你看看我给的问题,请读完问题,谢谢大家帮忙,我苦恼了很久啊,看百度说access是顺序的,但是我没写OleDbcommad语句,也不知道是不是这的问题,但是就是不知道问什么出现这样的问题。你们是我最后的希望了啊···
      

  13.   

    你可能少一行代码,我找下 dbo.CreateConnAccess(connStr); dbo.OledbCmd->CommandText =SQL;//没有这一句程序能运行,但更新不成功 dbo.oleda = gcnew OleDbDataAdapter(dbo.OledbCmd);//
    OleDb::OleDbCommandBuilder^ odcb = gcnew OleDbCommandBuilder(dbo.oleda); dbo.oleda->Update(this->dSetTj->Tables["dTabstat"]);
    这是C++的语法
    OleDb::OleDbCommandBuilder^ odcb = gcnew OleDbCommandBuilder(dbo.oleda);
      

  14.   

    你把SQL以及建立数据集的代码贴出来看看啊
      

  15.   

    ACCESS比不上SQL Server,功能弱小多,还有数据更新延时等问题,在SQL Server中正确运行的SQL,在ACCESS中不一定行
      

  16.   

    连接数据库,建立集合代码:
    string str = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + Environment.CurrentDirectory + "\\yiqi.dat;Persist Security Info=True;Jet OLEDB:Database Password=haozi110;User ID=Admin";
                OleDbConnection conn = new OleDbConnection(str);
                conn.Open();
                OleDbDataAdapter sqlda = new OleDbDataAdapter("select * from db_zubie", conn);
                //DataSet ds = new DataSet();//ds已经设置为全局变量
                sqlda.Fill(ds);
                conn.Close();
                AddTree(0, null, treeView1, ds.Tables[0]);
    //建立树形结构代码public void AddTree(int ParentID, TreeNode pNode, TreeView treeView, DataTable dt)
            {            DataView dvTree = new DataView(dt);
                //过滤ParentID,得到当前的所有子节点
                //dvTree.RowFilter = "[PARENTID] = " + ParentID;
                dvTree.RowFilter = "[parent1id]=" + ParentID;
                foreach (DataRowView Row in dvTree)
                {                TreeNode Node = new TreeNode();                if (pNode == null)
                    { //添加根节点
                        Node.Name = Row["id"].ToString();
                        Node.Text = Row["zubie"].ToString();
                        treeView.Nodes.Add(Node);
                        //Node.Expanded = true;
                        AddTree(Int32.Parse(Row["id"].ToString()), Node, treeView, dt); //再次递归
                    }
                    else
                    { //̀添加当前节点的子节点
                        Node.Name = Row["id"].ToString();
                        Node.Text = Row["zubie"].ToString();
                        pNode.Nodes.Add(Node);
                        //Node.Expanded = true;
                        AddTree(Int32.Parse(Row["id"].ToString()), Node, treeView, dt); //再次递归
                    }
                }
            }
      

  17.   

    OleDb::OleDbCommandBuilder^ odcb = gcnew OleDbCommandBuilder(dbo.oleda);
    少这一句吧
      

  18.   

    不知道你想看的sql语句 是不是连接时候的sql语句。除了上面连接时候的sql语句之外,我更新,删除,添加,均没有写任何sql语句··55愁人啊
      

  19.   

    你没有看我的代码。
    你仔细看下与你的有什么不同
    OleDb::OleDbCommandBuilder^ odcb = gcnew OleDbCommandBuilder(dbo.oleda);
    少这一句吧
    这是托管C++的语法
      

  20.   

    "select * from db_zubie", 这是你的SQL,那问题不在这,你还要检查你的数据表有没有主键
      

  21.   


    这句我没写过啊,OleDbCommand语句 我没写,我用的是winform中遍历查找到dtrow:DataRow dtrow in yiqiDataSet.Tables["db_zubie"].Rows;然后dtrow.delect();增加的时候也是用的yiqiDataSet.Tables["db_zubie"].Rows.Add(insertRow);
    //insertRow是用语句DataRow insertRow = yiqiDataSet.Tables["db_zubie"].NewRow();创建的
      

  22.   

    建立数据集的时候,在Fill之前更新时在UPDATE之前
      

  23.   


    恩,上了上面的那句,就会出现第二次添加再删除 报错“违反并发性:DwleteCommand 影响了预期1条记录中的0条”么?我去更改一下,然后再来讨教,谢谢你们啊!!