【问题标题】:Getting an E_OUTOFMEMORY when accessing an Access database with OLEDB使用 OLEDB 访问 Access 数据库时获取 E_OUTOFMEMORY
【发布时间】:2023-03-16 09:55:01
【问题描述】:

我们有这个连接到 MS Access 数据库并尝试插入新条目的 VB.net 代码:

Dim conn As New OleDbConnection
conn.ConnectionString = "Provider="Microsoft.ACE.OLEDB.16.0; Data Source=" & DATABASE_PATH & ";Jet OLEDB:Database Password=pass;"
conn.Open()

Dim SqlString As String = "INSERT INTO tblNotes" &
            " ([NotesNumber" &
            "], [NotesTitle" & 
            "], [HasAdditionalLogic" &
            "], [TypeId]) Values (?,?,?,?)"

Dim cmd As New OleDbCommand(SqlString, conn)
cmd.CommandType = CommandType.Text

cmd.Parameters.AddWithValue("NotesNumber", 1234)
cmd.Parameters.AddWithValue("NotesTitle", "the title")
cmd.Parameters.AddWithValue("HasAdditionalLogic", False)
cmd.Parameters.AddWithValue("TypeId", 14)

cmd.ExecuteNonQuery() 
conn.close()

没什么太花哨的,对吧? 此代码在安装 Access 2016 时运行良好。

现在随着最近升级到 Office 365 的线路

cmd.ExecuteNonQuery() 

导致此错误:

'Microsoft.ACE.OLEDB.16.0' 失败,没有可用的错误消息,结果代码:E_OUTOFMEMORY(0x8007000E)

谷歌搜索该错误消息导致了一些想法,例如在数据库中使用 Integer 而不是 Long Integer,但这也没有帮助。

就我个人而言,我怀疑根本原因是内存不足,因为机器安装了 32GB RAM 并设置为 32GB 虚拟内存。进程本身从不使用超过 100MB,Windows Process Explorer 告诉我们整个 RAM 总共使用大约 5GB。所以我简直不敢相信我们这里的内存真的用完了。

有什么想法吗?

更新:

好的,我们似乎在这里找到了根本问题。

你看到这一行:

cmd.Parameters.AddWithValue("TypeId", 14)

在 Access 数据库中,字段“TypeId”已定义为数据类型“AutoNumber”和字段大小“Long Integer”的主键。

现在,如果我们这样写代码:

cmd.Parameters.AddWithValue("TypeId", 14I)

它运行时没有错误,但只要我们将其更改为:

cmd.Parameters.AddWithValue("TypeId", 14L)

我们遇到了崩溃。

让我再次声明,带有 Long 的代码在 Access 2016 中运行良好,但在使用 Office 365 中的 Access 时会崩溃。

我可能弄错了,但这似乎是 Access 中的一个错误。

当然,我们现在可以将所有应用代码从Long 更改为Integer(或UInteger),但这似乎是治标不治本。

有人可以证实这一点吗?或者告诉我为什么会发生这种情况?使用Long 对我来说似乎是正确的,使用Integer 对我来说似乎很错误。

【问题讨论】:

  • 建议避免 AddWithValue 使用 Add 代替明确定义参数类型的地方。
  • 只要 Access 数据库文件(包括任何未提交的事务和缓存的数据)超过 2GB(Access 数据库的最大大小),您就会收到 E_OUTOFMEMORY。你接近那个了吗?
  • @Alex B:感谢您提供此信息,我们将在未来考虑这一点。无论如何,您在此处看到的代码只是一个小测试方法。
  • @Erik A.:我们离这个限制还很远。数据库本身大小为 6MB,整个应用程序使用的 RAM 不超过 100MB。所以不,这不是问题。让我重复一遍:相同的代码在使用 Access 2016 的客户端上运行良好。问题似乎是 Access 365。

标签: vb.net ms-access office365 oledb


【解决方案1】:

致任何可能面临同样问题的人:我们通过安装“Microsoft Access Database Engine 2010 Redistributable”“修复”了该问题 https://www.microsoft.com/en-US/download/details.aspx?id=13255 然后使用

Microsoft.ACE.OLEDB.12.0

而不是

Microsoft.ACE.OLEDB.16.0

成功了。 .add 而不是 .addWithValue 的提示没有任何区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多