1

我需要将数据导出到 Access 数据库中。我的代码有效,但它假设客户端计算机将 Microsoft.Jet.OLEDB.4.0 作为有效提供程序。

我想在代码中测试一下这是否正确。我的问题是我没有现有访问数据库的位置,我不想创建一个新的 .mdb 用于验证连接然后删除它。

有没有办法告诉安装了哪些提供程序?

4

5 回答 5

3

您可以简单地检查是否存在

HKEY_CLASSES_ROOT\CLSID\{dee35070-506b-11cf-b1aa-00aa00b8de95}

这是 Microsoft.Jet.OLEDB.4.0 的 CLSID。

于 2009-04-09T18:25:27.860 回答
2

如果支持您的提供程序,您可以尝试检测机器上的 MDAC 版本并基于该推断?

http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=47262&lngWId=1

这是您可以查看的片段。

于 2009-04-09T18:21:30.070 回答
1

每个主要提供商都有在注册表编辑器下提到的 classid 例如:- HKEY_CLASSES_ROOT\CLSID{dee35070-506b-11cf-b1aa-00aa00b8de95}

这是 Microsoft.Jet.OLEDB.4.0 的 CLSID。

要以编程方式检查,请使用下面的 c# 代码,它在 framework 2.0 上检查

using System.Data.OleDb;
OleDbEnumerator enumerator = new OleDbEnumerator();
        DataTable table = enumerator.GetElements();
        bool bNameFound = false;
        bool bCLSIDFound = false;

        foreach (DataRow row in table.Rows)
        {
            foreach (DataColumn col in table.Columns)
            {
                if ((col.ColumnName.Contains("SOURCES_CLSID")) && (row[col].ToString().Contains("{dee35070-506b-11cf-b1aa-00aa00b8de95}")))
                    Console.WriteLine("CLSID of Microsoft.Jet.OLEDB.4.0. Found");

                if ((col.ColumnName.Contains("SOURCES_NAME")) && (row[col].ToString().Contains("Microsoft.ACE.OLEDB.12.0")))
                {
                    bNameFound = true;
                    if ((col.ColumnName.Contains("SOURCES_CLSID")) && (row[col].ToString().Contains("{3BE786A0-0366-4F5C-9434-25CF162E475E}")))
                        bCLSIDFound = true;
                }
            }
        }

        if (!bNameFound && !bCLSIDFound)
            Console.WriteLine("Microsoft.ACE.OLEDB.12.0 Not found");
        else
            Console.WriteLine("Microsoft.ACE.OLEDB.12.0 found");

记住“正确修复它,不要让测试错误咬住”

于 2015-06-25T13:41:55.770 回答
0

我相信如果您安装了 .NET Framework(需要运行 VB.NET 代码),那么该机器就有您提到的提供程序。 MSDN

于 2009-04-09T18:22:45.903 回答
0
       Dim reader As Object = OleDbEnumerator.GetRootEnumerator()
        Dim Oleprovide As String = ""

        While reader.Read
            For i = 0 To reader.FieldCount - 1
                If reader.GetName(i) = "SOURCES_NAME" Then
                    If reader.GetValue(i).ToString.Contains(".OLEDB.") = True Then
                        Oleprovide = reader.GetValue(i).ToString
                        Exit For
                    End If
                End If
            Next
        End While
        reader.Close()

        Dim MyConnection As OleDbConnection
        MyConnection = New OleDbConnection("Provider=" & Oleprovide & ";Data Source=" & existingFile.FullName & ";Extended Properties=""Excel 13.0 Xml;HDR=Yes""")
        MyConnection.Open()
于 2019-01-15T15:17:08.263 回答