我在使用 Apple Silicon 在 macOS 上读取 golang 中的 .mdb 文件时遇到问题。
这是我使用的源代码:
package main
import (
"log"
_ "runtime/cgo"
accessdbwe "github.com/bennof/AccessDBwE"
_ "github.com/mattn/go-adodb"
)
func main() {
_, err := accessdbwe.Open("adodb", "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=PetStore2002.mdb;")
if err != nil {
log.Fatalf("failed to open mdb file: %T, %q", err, err)
}
println("success ping mdb")
}
代码运行时,
err
变量不是nil
而是err.String()
为空。所以我很困惑错误是什么。
我可以在 Windows 笔记本电脑上成功运行相同的代码。我的代码中有什么遗漏吗?
注意:我已经在 Windows 上使用 mdbtools、mdb 查看器和 ms access 检查了我的 .mdb 文件,该文件是有效的。
这是我的版本:
go version go1.20.2 darwin/arm64
包不支持在非 Windows 上读取 .mdb 文件
github.com/mattn/go-adodb
截至目前。
github.com/mattn/go-adodb
是一个“符合内置数据库/sql接口的Microsoft ADODB驱动程序”,它依赖github.com/go-ole/go-ole
与数据库进行通信。
底层包
github.com/go-ole/go-ole
提供“使用共享库代替cgo的Windows COM的Go绑定”,目前不支持非Windows。这是包的 README.md 文件中的声明:
目前还无法在 Linux 上测试该库,因为 COM API 特定于 Windows,目前无法在 Linux 上运行 COM 服务器,甚至无法连接到远程 COM 服务器。
err.String()
是空的?关于空错误消息,那是因为错误是一个ole.OleError。在描述为空的情况下,它调用
errstr(int(v.hr))
将错误代码转换为字符串。在非 Windows 上,errstr func 只返回一个空字符串。
您可以使用调试器找出错误的详细信息。错误代码最有可能是
0x80004001
,即E_NOTIMPL: Not implemented
(参见Common HRESULT Values)。