access多线程插入数据-"无法更新;当前被锁定"
不清楚到底是数据库的问题
还是程序的问题
诡异的是
也不是次次报错,偶尔可以跑完
C# code
public void loaddata()
{
for (int i = 0; i < 75; i=i+5) //线程
{
Thread myThread = new Thread(delegate() {catchdate(i);});
myThread.Start();
}
}
public void catchdate(int i) //插入
{
OleDbCommand com = new OleDbCommand("insert into log(url) values('http://"+m.Groups[2].Value+"')", conn);
OleDbDataReader dr = com.ExecuteReader();
dr.Close();
}
------解决方案--------------------这个和ACCESS和SQLSERVER没有关系的
主要还是OleDbDataReader的问题
DataReader是独占的,同一个时间只能有一个DataReader
加个lock吧
lock(this)
{
OleDbCommand com = new OleDbCommand("insert into log(url) values('http://"+m.Groups[2].Value+"')", conn);
OleDbDataReader dr = com.ExecuteReader();
dr.Close();
}
------解决方案--------------------public void catchdate(int i) //插入
{
OleDbCommand com = new OleDbCommand("insert into log(url) values('http://"+m.Groups[2].Value+"')", conn);
com.ExecuteNonQuery();
}
大概是这样吧
------解决方案--------------------文件式的都是这样,文件式的你也可以试一试Microsoft SQL Server Compact 3.5,我不知道它是不是比Access快,你可以试一下。如果感觉慢,也不用从多线程入手,多半是数据库设计问题。
数据库采用多线程读写往往不是为了效率主动开多线程去读写,而是服务端的设计,比如异步通信,迫使设计者去对数据库进行多线程读写。