首页 > 解决方案 > 使用 OLEDB 访问 Access 数据库时获取 E_OUTOFMEMORY

问题描述

我们有这个连接到 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)

我们得到了崩溃。

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

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

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

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

标签: vb.netms-accessoffice365oledb

解决方案


对于任何可能面临同样问题的人:我们通过安装“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没有任何区别。


推荐阅读