出现的问题是:利用OleDbDataAdapter更新Access2003数据库出现:未处理DBConCurrencyException(违反并发性)异常
增删查,都没有问题,唯独更新不可以(access2003中的输入参数也是按照名称来匹配的.用不用Original版本的数据都不行)
测试的数据库是
================================
    字段名称      字段类型    长度
     ID           数字
     Name         文本        50
    Sex          文本         10
=================================测试数据
=================================
ID Name Sex
2 kevin 男
3 大笨熊 女
=================================
出问题的原因是,我从表中把数据读出来以后,更新了其中的一条
然后我要update回去.在调用da.update方法时候抛出了异常
da = new OleDbDataAdapter();
/*这里面肯定是有数据的,不是没有数据造成的*/
ds.Tables[0].Rows[0]["Name"] = "猪头" + DateTime.Now.Millisecond.ToString();
cmd.CommandText = @"Update Student set Name = @Name, Sex = @Sex Where ID = @Original_ID;";
cmd.Parameters.Add(GetCommandParameterObject("@Original_ID", OleDbType.Integer, 4, "ID", true));
cmd.Parameters.Add(GetCommandParameterObject("@Name", OleDbType.VarChar, 50, "Name", false));
cmd.Parameters.Add(GetCommandParameterObject("@Sex", OleDbType.VarChar, 50, "Sex", false));
da.UpdateCommand = cmd;
da.Update(ds);==============
GetCommandParameterObject方法
public static DbParameter GetCommandParameterObject(String parameterName, OleDbType sqlDataType, Int32 size, String sourceColumn, Boolean isOriginal)
{
    DbParameter returnParameter;
    if (!isOriginal)
    {
        returnParameter = ((DbParameter)(new OleDbParameter(parameterName, sqlDataType, size, sourceColumn)));
    }
    else
    {
        returnParameter = ((DbParameter)
                    (new OleDbParameter(parameterName, sqlDataType, size,
                    System.Data.ParameterDirection.Input, false, ((System.Byte)(0)),
                    ((System.Byte)(0)), sourceColumn, System.Data.DataRowVersion.Original, null)));
    }
     return returnParameter;
}

解决方案 »

  1.   

    偶找到原因了.是参数顺序的问题.日了.刚才还特意验证了一下.结果连的是sql2005数据库,一直以为是测试顺序时候用的是access呢
      

  2.   


    Access数据库的参数只认位置,不认名字
    cmd.CommandText = @"Update Student set Name = ?, Sex = ? Where ID = ?";
    cmd.Parameters.Add(GetCommandParameterObject("?", OleDbType.VarChar, 50, "Name", false));
    cmd.Parameters.Add(GetCommandParameterObject("?", OleDbType.VarChar, 50, "Sex", false));
    cmd.Parameters.Add(GetCommandParameterObject("?", OleDbType.Integer, 4, "ID", true));