在具有 Apple Silicon 架构的 Mac OS 上使用 golang 读取 .mdb 文件

问题描述 投票:0回答:1

我在使用 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
go ms-access adodb cgo
1个回答
1
投票

TL;博士

包不支持在非 Windows 上读取 .mdb 文件

github.com/mattn/go-adodb
截至目前。

为什么非 Windows 不支持它?

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)。

© www.soinside.com 2019 - 2024. All rights reserved.