不用CODE,我两张表都直接绑定到DataGrid的,只有一个按钮,内容如下:try
{
    daProdList.Update( dsMyData.ProdList );
    daCardList.Update( dsMyData.CardList );
}
catch( OleDbException ex )
{
    MessageBox.Show( ex.ToString() );
}

解决方案 »

  1.   

    读到数据集里面之后在DataTable之间建立对应的 Constraints之后再操作数据:
    ms-help://MS.NETFrameworkSDKv1.1.CHS/cpguidenf/html/cpconaddingconstraintstodataset.htmForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",
    custDS.Tables["CustTable"].Columns["CustomerID"], 
    custDS.Tables["OrdersTable"].Columns["CustomerID"]);
    custOrderFK.DeleteRule = Rule.None;  
    // Cannot delete a customer value that has associated existing orders.
    custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);
      

  2.   

    那我说得再详细一点吧!我的程序是为了要把EXCEL数据追加进ACCESS数据库而编写的。采用的方法是先把ACCESS数据加载进数据集,然后把EXCEL数据追加进数据集里,再用数据集的内容更新数据库。
    数据库里有ProdList和CardList两张表,关系是一对多。那我说得再详细一点吧!我的程序是为了要把EXCEL数据追加进ACCESS数据库而编写的。采用的方法是先把ACCESS数据加载进数据集,然后把EXCEL数据追加进数据集里,再用数据集的内容更新数据库。
    数据库里有ProdList和CardList两张表,关系是一对多。/// <summary>
    /// 追加品番数据
    /// </summary>
    /// <param name="strFileName">追加文件名</param>
    private void AppendProd( string strFileName )
    {
    dsData.ProdListRow drNew;
    OleDbTransaction trnNew; //
    // 数据库连接
    //
    string strConn = string.Format(
    @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;", strFileName );
    OleDbConnection cn = new OleDbConnection( strConn ); cn.Open();
    trnNew = cn.BeginTransaction();
    //
    // 数据命令
    //
    string strSelect = string.Format(
    "SELECT DISTINCT MMPROD, MMSFIX FROM [{0}$] WHERE MMPROD <> '' AND MMSFIX <> ''",
    Path.GetFileNameWithoutExtension(strFileName) );
    OleDbCommand cmdSelect = new OleDbCommand( strSelect, cn, trnNew );

    //
    // 读取EXCEL文件中的切断场所
    //
    OleDbDataReader rdrNew = cmdSelect.ExecuteReader();

    try
    {
    string prod = "";
    string sfix = "";
    while( rdrNew.Read() )
    {
    prod = rdrNew["MMPROD"].ToString().Trim();
    sfix = rdrNew["MMSFIX"].ToString().Trim();
    if( !IsProdExist( prod, sfix ) )
    {
    drNew = dsMyData.ProdList.NewProdListRow();
    drNew["PF_PROD"] = prod;
    drNew["PF_SFIX"] = sfix;
    dsMyData.ProdList.AddProdListRow( drNew );
    }
    }
    rdrNew.Close();
    trnNew.Commit();
    }
    catch( OleDbException ex )
    {
    trnNew.Rollback();
    MessageBox.Show( ex.ToString() );
    }
    finally
    {
    cn.Close();
    }
    }
    /// <summary>
    /// 追加卡片数据
    /// </summary>
    /// <param name="strFileName">追加文件名</param>
    private void AppendCard( string strFileName )
    {
    dsData.CardListRow drNew;
    OleDbTransaction trnNew;
    //
    // 数据库连接
    //
    string strConn = string.Format(
    @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;", strFileName );
    OleDbConnection cn = new OleDbConnection( strConn ); cn.Open();
    trnNew = cn.BeginTransaction();
    //
    // 数据命令
    //
    string strSelect = string.Format(
    "SELECT * FROM [{0}$] " +
    "WHERE MMCUTA <> '' AND MMPROD <> '' AND MMSFIX <> '' " +
    "AND MMWKNN <> '' AND MMWSIN <> '' AND MMTER1 <> '' " +
    "AND MMTER2 <> '' AND MATCD1 <> '' AND MATCD2 <> ''",
    Path.GetFileNameWithoutExtension(strFileName) );
    OleDbCommand cmdSelect = new OleDbCommand( strSelect, cn, trnNew );

    //
    // 读取EXCEL文件中的切断场所
    //
    OleDbDataReader rdrNew = cmdSelect.ExecuteReader();

    try
    {
    while( rdrNew.Read() )
    {

    drNew = dsMyData.CardList.NewCardListRow(); // 这里调用自定义函数GetProdPK获取品番主键
    drNew["PF_PK"] = GetProdPK( rdrNew["MMPROD"].ToString().Trim(),
    rdrNew["MMSFIX"].ToString().Trim() ); //
    // ...
    //
    dsMyData.CardList.AddCardListRow( drNew );
    }
    rdrNew.Close();
    trnNew.Commit();
    }
    catch( OleDbException ex )
    {
    trnNew.Rollback();
    MessageBox.Show( ex.ToString() );
    }
    finally
    {
    cn.Close();
    }
    }
    /// <summary>
    /// 获取品番主键
    /// </summary>
    /// <param name="prod">品番</param>
    /// <param name="sfix">阶段</param>
    /// <returns>品番主键</returns>
    private int GetProdPK( string prod, string sfix )
    {
    foreach( DataRow row in dsMyData.ProdList.Rows )
    {
    if( row.RowState != DataRowState.Deleted &&
    row["PF_PROD"].ToString() == prod &&
    row["PF_SFIX"].ToString() == sfix )
    {
    return (int)row["PF_PK"];
    }
    } return -1;
    }
      

  3.   

    针对数据集的其他操作我都是通过DataGrid的,自己一行代码都没写,就没什么好说了。
    急呀!
      

  4.   

    我刚调试了一下,发现这个问题和表间关联似乎没有关系,只有一张表的时候居然也会出错!!!
    大家可以跟着我的做法试做一下,帮我解决这个问题。1、在设计时把表绑定到DataGrid,并创建两个按钮:一个是追加数据用的,一个是Update数据源用的;
    2、程序启动时Fill数据表;
    3、在追加数据的按钮里面调用自定义的AppendProd(),再试着通过DataGrid添加、修改、删除数据(多试几次);
    4、更新数据(这时很有可能就会出错了)。
    谁能帮我解决这问题的,我可以单独开帖送他一百分!!!
      

  5.   

    你在数据库中建立了参照(引用)没有?
    如果是一个ProdList对应于多个CartList的话。
    ProdList的ID是不能随意改变的,一定要先改变CartList对于ID的引用。
    举个例子:
    删除ProdID为0001的产品,而没有删除CartList中的对应项。这样
    的SQL语句是不能执行的。肯定会报错。要找出问题的所在首先要重复一下你的错误,先清空所有数据,然后
    想办法重现错误,并作详细记录。我的猜测:
    1.CartList中引用了ProdID作为外部关键字(或约束)
    2.你修改的是CartList的ProdID的值
    3.恰好该值在ProdID中没有对应,所以报错。如果只有一张表还会出错,事情就难办了。请写出详细报错。
      

  6.   

    我也遇到过这个问题,后来发现对一个table中的记录,全部都填入的就没有问题,只有部分填入的就会出现这个问题,后来干脆把一些原本不让填入的数据都做了校验,使它们必须填入后,就没有这个问题了。如果能解决这个问题固然是好事情,如果无法解决,建议你可以用我说的方法试试,尽管理论上说没有解决问题,但是实际上也算是解决了吧!
      

  7.   

    我遇到过这样一次,就是对某一张表并没有修改,就Update时错误提示和你的一样,不过这次可能不是那个问题!
      

  8.   

    To rategy(呼吸空气的鱼) :还是那个错误呀!并发冲突:DeleteCommand影响0个记录……而且引发错误的是ProdList。
      

  9.   

    To sy246(新手!多关照!) :我是直接绑定DataGrid的,也有调用Update
      

  10.   

    找出原因了,果然是和我一开始想的一样。数据源主键与数据集的主键并不对应(都是自动编号的)!上面的错误只要执行  添加--》更新--》删除--》更新   便会出错,原因大家想想就会明白了。我把原来的Update语句从
    daPartNumbers.Update( dsMyData, "PartNumbers" );
    改为
    daPartNumbers.Update( dsMyData, "PartNumbers" );
    dsMyData.PartNumbers.Clear();
    daPartNumbers.Fill( dsMyData, "PartNumbers" );再观察了一下,一开始读入的两条记录编号是1和2,执行完更新操作之后变成了78和79!!!难怪删除记录的时候会出错……现在问题暂时是解决了,可像那种笨办法总不能一用再用吧?我还是期待有个从道理上能说得通的解决方法。
      

  11.   

    对于自动编号的,你在update语句中不要全部update,用如下的语句试试,
    if(dsMyData.GetChange() !=null)
    {
    daPartNumbers.Update( dsMyData, "PartNumbers" );
    }
    dsMyDate.AccepChanges();
      

  12.   


    daPartNumbers.Update( dsMyData.GetChange() , "PartNumbers" );这样会少提交点数据