英文:
Read .mdb file using golang on mac os with apple silicon architecture
问题
我在使用golang在macOS上的苹果芯片上读取.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("无法打开mdb文件:%T, %q", err, err)
}
println("成功连接到mdb")
}
当代码运行时,err
变量不是nil
,但err.String()
为空。所以我对错误是什么感到非常困惑。
我可以在Windows笔记本上成功运行相同的代码。我的代码中是否有遗漏的部分?
注意:我已经使用mdbtools、mdb viewer和ms access在Windows上检查了我的.mdb文件,文件是有效的。
这是我的go版本:
go version go1.20.2 darwin/arm64
英文:
I had an issue while reading .mdb file in golang on macOS with apple silicon.
This is the source code that I use:
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")
}
When the code run, the err
variable is not nil
but err.String()
is empty. So I'm very confused about what is the error.
I can run the same code successfully on a windows laptop. Is there anything missed in my code?
Note: I've checked my .mdb file using mdbtools, mdb viewer and ms access on windows and the file is valid.
This my go version:
go version go1.20.2 darwin/arm64
答案1
得分: 4
TL;DR
截至目前,github.com/mattn/go-adodb
包不支持在非Windows系统上读取 .mdb 文件。
为什么在非Windows系统上不支持?
github.com/mattn/go-adodb
是一个“符合内置 database/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 函数 只返回一个空字符串。
你可以使用调试器查找错误的详细信息。很可能错误代码是 0x80004001
,即 E_NOTIMPL: 未实现
(参见 Common HRESULT Values)。
英文:
TL;DR
Reading .mdb file on non-Windows is not supported by the package github.com/mattn/go-adodb
as of now.
Why it's not supported on non-Windows?
github.com/mattn/go-adodb
is a "Microsoft ADODB driver conforming to the built-in database/sql interface", which depends on github.com/go-ole/go-ole
to communicate with the database.
The underlying package github.com/go-ole/go-ole
provides "Go bindings for Windows COM using shared libraries instead of cgo", which does not support non-Windows as of now. Here is the statement from the README.md file of the package:
> It is also not currently possible to test the library on Linux, since COM API is specific to Windows and it is not currently possible to run a COM server on Linux or even connect to a remote COM server.
Why err.String()
is empty?
Regarding the empty error message, that's because the error is an ole.OleError. In the case when the description is empty, it calls errstr(int(v.hr))
to convert error code to string. And on non-Windows, the errstr func just returns an empty string.
You can use a debugger to find out the details of the error. It's most likely that the error code is 0x80004001
, which is E_NOTIMPL: Not implemented
(see Common HRESULT Values).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论