同时连接到Access数据库多次?

时间:2013-12-31 21:10:53

标签: c# database ms-access asynchronous oledb

长版: 我想连接到我的数据库,该连接是异步完成的,因为它会延迟Form。

现在这工作正常,但是我正在调用OleDb代码来完成scrollbar_valueChanged事件中的工作。 这就是引起问题的地方,因为当用户非常快地滚动滚动条时,后台的OleDb代码也会做的事情。

现在我想通过执行'classname.db.cmd.connection.Close();'来解决这个问题,这会关闭后台OleDb代码的连接,但不会阻止代码尝试连接时已经有一个连接尝试...

简短版本 我正在使用异步代码运行我的'慢'数据库读取代码,但是可以再次非常快地运行相同的数据库连接。 而且由于异步工作的原因,它再次将代码放在一边,代码再次尝试连接,但仍然有其他数据库连接打开。

实际问题: 那么,有没有办法同时使用多个连接,从OleDb读取相同的Access数据库?

1 个答案:

答案 0 :(得分:2)

首先,我猜这里的问题是滚动条事件频繁触发并使用连接池中的所有可用连接。有很多方法可以解决这个问题。第一种是在使用连接之前和之后在共享变量上添加“Monitor.Enter”。这将导致它将冻结您的UI,直到数据库I / O完成(这相对较慢)。换句话说,这不是一个令人满意的解决方案

可能更好的方法是如下(伪代码):

  • ScrollChange事件触发
  • 调用“无效屏幕”或“运行数据库I / O”例程
  • 该例程一次只运行1个,并将加载待处理的数据集,无论这些数据集是什么。

DatabaseIO例程看起来像(Pseudocode):

public void ScrollBarChange(EventArgs e) {
   // to call the routine:
   Thread myThread = new Thread(new ThreadStart(DatabaseIO));
   myThread.Start();

   // any other code you need to run immediately
}

public void DatabaseIO() {
   try {
     Monitor.Enter(this);
     if (ioActive) { pendingEvents = true; return; }
     ioActive = true;
   } finally {
     Monitor.Exit(this);
   }

   // run the database io normally here...

   // check pending events and call "DatabaseIO" again to make sure everything is processed
   if (pendingEvents) {
     pendingEvents = false;
     DatabaseIO();
   }
}

请记住,由于这将在一个线程中运行,您将无法访问UI控件,这意味着您需要在启动线程之前保存这些变量并确保它们在线程的生命周期内不会更改。否则,这是一种通常很好的异步模式,用于响应快速触发的屏幕事件。希望它有所帮助,祝你好运!