日期:2014-05-17  浏览次数:21467 次

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快,你可以试一下。如果感觉慢,也不用从多线程入手,多半是数据库设计问题。
数据库采用多线程读写往往不是为了效率主动开多线程去读写,而是服务端的设计,比如异步通信,迫使设计者去对数据库进行多线程读写。