C# 超出OLEDBEException系统资源

C# 超出OLEDBEException系统资源,c#,oledbexception,C#,Oledbexception,下面的代码执行一个简单的insert命令。如果连续调用它2000次(插入2000行),将抛出一个OLEDBEException,并显示消息=“超出系统资源”。我还应该做些什么来释放资源吗 using (OleDbConnection conn = new OleDbConnection(connectionString)) using (OleDbCommand cmd = new OleDbCommand(commandText, conn)) { conn.Open(); c

下面的代码执行一个简单的insert命令。如果连续调用它2000次(插入2000行),将抛出一个OLEDBEException,并显示消息=“超出系统资源”。我还应该做些什么来释放资源吗

using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
    conn.Open();
    cmd.ExecuteNonQuery();
}

系统资源超出错误不是源于托管代码,而是源于您杀死了数据库(JET?)

你打开的连接太多,速度太快

一些提示:

  • 通过不为每个命令打开新连接来避免往返,并使用单个连接执行插入
  • 确保数据库连接池正在工作。(不确定这是否适用于OLEDB连接。)
  • 考虑使用更优化的方法插入数据
你试过这个吗

using (OleDBConnection conn = new OleDBConnection(connstr))
{
    while (IHaveData)
    {
        using (OldDBCommand cmd = new OldDBCommand())
        {
            cmd.Connection = conn;
            cmd.ExecuteScalar();
        }
    }
}

我用Access 2007数据库测试了这段代码,没有例外(我插入了13000个)

然而,我注意到它非常慢,因为你每次都在创建一个连接。如果你把“使用(连接)”放在循环之外,它会运行得更快

除了上述内容(仅连接到数据库一次),我还希望确保您正在关闭和处理连接。由于c#中的大多数对象都是通过wrt内存管理的,连接和流并不总是具有这种优势,因此,如果这样的对象不被处理,它们就不能保证被清理。这有一个额外的效果,即在程序的生命周期中保持该连接的打开状态


此外,如果可能的话,我会考虑使用事务。我不知道您使用此代码的目的是什么,但OLEDB事务在插入和更新数据库中的许多行时非常有用。

我不确定具体细节,但我遇到了类似的问题。我们利用带有IIS的Access数据库为我们的客户提供服务。我们没有太多的客户端,但是在单个会话中有很多连接被打开和关闭。经过大约一周的工作,我们收到了相同的错误,所有连接尝试都失败了。为了纠正这个问题,我们所要做的就是重新启动辅助进程


经过一些研究,我发现(当然)Access在这种环境中的性能并不好。资源不能正确释放,随着时间的推移,可执行文件将耗尽。为了解决这个问题,我们将使用Oracle数据库。如果这不能解决问题,我将随时向您更新我的发现。

这可能是因为您没有处理创建的连接和命令对象。始终在末端处理对象

OledbCommand.Dispose();

你有资料支持吗?我不记得我的资料了,已经很久了。但是在网上的许多地方,我发现了很多关于这个问题确实存在的评论。很抱歉,我没有更多信息。我遇到了类似的问题,将
using()
语句移出循环不仅消除了异常,而且大大提高了速度。谢谢。用于OLE DB的.NET Framework数据提供程序使用OLE DB会话池自动池连接。通过设置
OLE DB Services
,可以在连接字符串中禁用此功能。从“使用”范围转义后,将释放对象。这就是“使用”工作原理正确处理对象是他
使用
语句的全部要点。