以下代码的执行插入一个简单的命令。如果它被称为2,000倍的连续(插入2,000行)的一个OleDbException有消息="系统资源超过了"被抛出。有没有别的东西我应该做的以免费了资源?

using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
    conn.Open();
    cmd.ExecuteNonQuery();
}
有帮助吗?

解决方案

该系统的资源超出错误不是来自管理的码,它来自你杀死你的数据库(喷?)

你是开放的方式来很多连接的方式来快速的...

一些提示:

  • 避免往返通过不打开一个新的连接,为每个单个指令,并执行插使用一个单一的连接。
  • 确保数据库连接集工作(不确定如果适用OLEDB连接)。
  • 考虑使用更加优化的方式插入的数据。

你有没有试过这个吗?

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

其他提示

我使用Access 2007数据库测试了此代码,没有例外(我高达13000次插入)。

但是,我注意到的是,每次创建连接时速度都非常慢。如果你把“使用(连接)”放在在循环之外,它变得更快。

除了上述内容(仅连接数据库一次)之外,我还要确保您关闭并处理您的连接。由于c#中的大多数对象都是由内存管理的,因此连接和流总是没有这种奢侈,所以如果没有处理这样的对象,则不能保证它们被清除。这样可以在程序的生命周期内保持连接打开。

另外,如果可能的话,我会考虑使用交易。我无法分辨您使用此代码的内容,但OleDbTransactions在插入和更新数据库中的许多行时非常有用。

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

经过一些研究,我发现(当然)Access在这种环境下表现不佳。资源无法正确释放,随着时间的推移,可执行文件将耗尽。为了解决这个问题,我们将转向Oracle数据库。如果这不能解决问题,我会及时向您通报我的发现。

这可能是因为您没有处理创建的Connection和Command对象。始终在最后处置对象。

OledbCommand.Dispose();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top