2

我对 ADOX Interop 有一个非常奇怪的问题。

我有这个代码:

        try
        {
            if (File.Exists(path))
                File.Delete(path);

            var cat = new CatalogClass();
            cat.Create("Provider=Microsoft.Jet.OLEDB.4.0; Data Source = d:\\Test.mdb; Jet OLEDB:Engine Type=5");

            Marshal.ReleaseComObject(cat);
            cat = null;
            GC.Collect();
        }
        catch (FileNotFoundException e)
        {
            throw new FileNotFoundException("El archivo no se encuentra", e);
        }
        catch (COMException e)
        {
            throw new COMException(connStr + e.Message);
        }
        catch (Exception e)
        {
            throw new Exception(connStr, e);
        }

代码在 cat.Create() 行中失败。真正奇怪的是,在我的本地开发人员机器上它工作正常,但在生产服务器中却没有......这不是写权限问题,因为我试图在问题行之前生成一个随机文件并且工作完美。COMException 消息只是“未指定错误”HResult:-2147467259

服务器操作系统是 Windows 2008 32 位。我认为是服务器配置问题,但你能给我一些启示吗?我不知道我还能做什么...

4

2 回答 2

3

如果您将应用程序部署在 64 位机器上,您的代码将无法通过 JET.OleDB.4.0 使用 ADOX。
如果是这种情况,那么一个快速的解决方案可能是将您的目标架构更改为 x86。

否则,您可以尝试在目标机器上下载并安装 64 位版本的Microsoft Access 数据库引擎驱动程序,但我不知道它们是否支持 ADOX。您还需要更改连接字符串

于 2012-04-09T22:10:53.323 回答
2

看看你是否可以在你的 c# 代码之外使用 ADOX Catalog。如果您安装了 Access,请按照 Steve 的建议尝试使用 Access VBA。如果没有安装 Office,请尝试使用 VBScript。

这适用于我的 32 位 Windows 7。在 64 位 Windows 7 上,它失败并出现有关“类未注册”的错误。我意识到这不是你的情况,因为你说你的服务器是 32 位的(回复一个已经被删除的答案)。但是我希望脚本要么成功,要么给你一个比你从 c# 错误条件中得到的信息更丰富的错误消息。

'Const cPath = "C:\Users\hans\Documents\Test.mdb"
Const cPath = "d:\Test.mdb"
Dim objCat
Dim strConnect
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & cPath & ";Jet OLEDB:Engine Type=5"
WScript.Echo strConnect

Set objCat = CreateObject("ADOX.Catalog")
objCat.Create strConnect
Set objCat = Nothing

我命名了该文件AdoxCreateDb.vbscscript从命令提示符窗口运行它。

cscript AdoxCreateDb.vbs
于 2012-04-10T00:09:54.977 回答