vb.net - 使用 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 的代码在Long
Access 2016 中运行良好,但在使用 Office 365 中的 Access 时会崩溃。
我可能弄错了,但这似乎是 Access 中的一个错误。
当然,我们现在可以将所有应用程序代码从更改Long
为Integer
(或UInteger
),但这似乎是治标不治本。
有人可以证实这一点吗?或者告诉我为什么会发生这种情况?使用 aLong
对我来说似乎是正确的,而使用 an 对我来说Integer
似乎是非常错误的。
解决方案
对于任何可能面临同样问题的人:我们通过安装“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
没有任何区别。
推荐阅读
- c# - 使用意外类型将 XML 反序列化为 C# 类错误 (2,2)
- c++ - 在 ROOT 的 CINT 中包含模板函数
- reactjs - react-hook-form:从 api 端点获得响应后如何显示验证消息?
- yii2 - 我使用 Yii2 并且我需要连接 ckedit5,但是上传照片时出现错误 - 400(错误请求)
- java - 替代 Thread.sleep() 以获得性能?
- php - 可选的参考数组 php
- mysql - 使用 Docker-compose 配置 MySQL 主从
- logging - 从 log4j 1.x 迁移到 log4j 2.12.1
- forms - 如何将日期从静态网站表单传递到 Google 表单?
- graphql - GraphQL 正在返回额外的信息,这会减慢初始加载速度