我需要将数据导出到 Access 数据库中。我的代码有效,但它假设客户端计算机将 Microsoft.Jet.OLEDB.4.0 作为有效提供程序。
我想在代码中测试一下这是否正确。我的问题是我没有现有访问数据库的位置,我不想创建一个新的 .mdb 用于验证连接然后删除它。
有没有办法告诉安装了哪些提供程序?
我需要将数据导出到 Access 数据库中。我的代码有效,但它假设客户端计算机将 Microsoft.Jet.OLEDB.4.0 作为有效提供程序。
我想在代码中测试一下这是否正确。我的问题是我没有现有访问数据库的位置,我不想创建一个新的 .mdb 用于验证连接然后删除它。
有没有办法告诉安装了哪些提供程序?
您可以简单地检查是否存在
HKEY_CLASSES_ROOT\CLSID\{dee35070-506b-11cf-b1aa-00aa00b8de95}
这是 Microsoft.Jet.OLEDB.4.0 的 CLSID。
如果支持您的提供程序,您可以尝试检测机器上的 MDAC 版本并基于该推断?
http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=47262&lngWId=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");
记住“正确修复它,不要让测试错误咬住”
我相信如果您安装了 .NET Framework(需要运行 VB.NET 代码),那么该机器就有您提到的提供程序。 MSDN
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()