[Ado.net + Access] 利用OleDbDataAdapter更新Access2003数据库出现:未处理DBConCurrencyException(违反并发性)异常

wangchao1982 2008-07-16 05:06:49
出现的问题是:利用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;
}




...全文
102 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
amandag 2008-07-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wangchao1982 的回复:]
偶找到原因了.是参数顺序的问题.日了.刚才还特意验证了一下.结果连的是sql2005数据库,一直以为是测试顺序时候用的是access呢
[/Quote]

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));

wind1997 2008-07-16
  • 打赏
  • 举报
回复
给我留着,等明天我来!
wangchao1982 2008-07-16
  • 打赏
  • 举报
回复
偶找到原因了.是参数顺序的问题.日了.刚才还特意验证了一下.结果连的是sql2005数据库,一直以为是测试顺序时候用的是access呢

110,023

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧