8

下面的代码执行一个简单的插入命令。如果连续调用 2,000 次(插入 2,000 行),则会抛出带有 message = "System Resources Exceeded" 的 OleDbException。我还应该做些什么来释放资源吗?

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

5 回答 5

7

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

您打开的连接太多,太快了...

一些技巧:

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

你试过这个吗?

using (OleDBConnection conn = new OleDBConnection(connstr))
{
    while (IHaveData)
    {
        using (OldDBCommand cmd = new OldDBCommand())
        {
            cmd.Connection = conn;
            cmd.ExecuteScalar();
        }
    }
}
于 2008-10-01T02:12:17.140 回答
1

我用 Access 2007 数据库毫无例外地测试了这段代码(我的插入次数高达 13000 次)。

但是,我注意到它非常慢,因为您每次都在创建连接。如果将“使用(连接)”放在循环之外,它会更快。

于 2008-10-01T02:46:57.773 回答
0

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

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

于 2008-10-01T03:29:22.760 回答
0

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

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

于 2009-02-11T16:08:13.063 回答
-1

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

OledbCommand.Dispose();
于 2014-01-20T06:40:18.410 回答