【发布时间】: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