OleDbException超出系统资源

时间:2008-10-01 02:10:10

标签: c# oledbexception

以下代码执行简单的插入命令。如果连续调用2000次(插入2,000行),则抛出一个带有message =“System Resources Exceeded”的OleDbException。我是否应该采取其他措施来释放资源?

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

5 个答案:

答案 0 :(得分:5)

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

你正在开辟许多联系,快速的方式...

一些提示:

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

你试过这个吗?

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

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

OledbCommand.Dispose();