我在我的删除程序里面写上:
  ....
 OleDbCommandBuilder scoreDB=new OleDbCommandBuilder(scoreAdapter);
 OleDbCommandBuilder bookDB=new OleDbCommandBuilder(bookAdapter);
   ..... ds.Tables["score"].Rows[2].Delete();
 ds.Tables["book"].Rows[1].Delete();
 scoreAdapter.Update(ds,"score");
 bookAdapter.Update(ds,"book");系统提示如下错误:
对于不返回任何键列信息的 SelectCommand 不支持 DeleteCommand 的动态 SQL 生成。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: 对于不返回任何键列信息的 SelectCommand 不支持 DeleteCommand 的动态 SQL 生成。源错误: 
行 120: //删除假卡库中的数据
行 121: ds1.Tables["FcardInfo"].Rows[0].Delete();
行 122: FcardAdapter.Update(ds1,"FcardInfo");
行 123: //删除真卡中的数据
行 124: ds1.Tables["TcardInfo"].Rows[0].Delete();
 

解决方案 »

  1.   

    不要使用CommandBuilder, DataAdapter的SelectCommand可以是一个多表数据集,采用存储过程,里面的语句如:
    Select * From Score
    Select * From Book然后分别写Score和book的删除、插入、更新的过程采用同一个DataAdapter就可以更新了。
      

  2.   

    Access里面如何写存储过程啊?
      

  3.   

    改成这样:
    用一个da
    OleDbCommandBuilder scoreDB=new OleDbCommandBuilder(scoreAdapter);
    ////////////////////
    scoreAdapter.DeleteCommand=scoreDB.GetDeleteCommand();//生成自动的sql命令
    //////////////////// ds.Tables["score"].Rows[2].Delete();
     ds.Tables["book"].Rows[1].Delete();
     scoreAdapter.Update(ds,"score");
     scoreAdapter.Update(ds,"book");
    试一试,应该可以的