.net的这经典bug
最近在做项目时,发现.net对自动编号的表多条数据进行更新时有个严重bug,导致项目几乎要重做。
1、先建这样一个表
create table tb(id int identity primary key,
value char(10));
2、用.net ide的服务器资源管理器将这个表拖到窗体上,讲设计器生成的连接命名为con,数据适配器命名为sda,然后右击适配器,将生成的类型化数据集命名为ds
3、在窗体上添加添加一个按钮button1,按钮的代码如下:
try
{
ds1.Clear();
for (int i=0;i<30;i++)
{
ds.tbRow r=ds1.tb.NewtbRow();
r.BeginEdit();
r.value="aaa";
r.EndEdit();
ds1.tb.AddtbRow(r);
}
con.Open();
}
sda.Update(ds1.tb);
MessageBox.Show("ok");
}
catch(System.Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
4、运行代码,会产生这样的错误
列"id"被约束为唯一的,值1已存在
5、有时候这种现象会消失,但是如果新建一个表,一定会重复出现。而且最可怕的是,这种现象会不规则的出现。
6、以下sql代码可以重建这个表
drop table tb;
create table tb(id int identity primary key,
value char(10));
select count(*) from tb
7、如果自己用windows生成的sql命令,则可以更新数据,但是会引起删除时的并发错误问题。
try
{
ds1.Clear();
for (int i=0;i<30;i++)
{
ds.tbRow r=ds1.tb.NewtbRow();
r.BeginEdit();
r.value="aaa";
r.EndEdit();
ds1.tb.AddtbRow(r);
}
con.Open();
for(int i=0;i<ds1.tb.Count;i++)
{
sda.InsertCommand.Parameters["@value"].Value=ds1.tb[i].value;
sda.InsertCommand.ExecuteNonQuery();
} MessageBox.Show("ok");
}
catch(System.Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
大家有兴趣可以讨论一下,看有没有办法解决这个大型bug