如何检查系统上是不是安装了 OLEDB 驱动程序?

Posted

技术标签:

【中文标题】如何检查系统上是不是安装了 OLEDB 驱动程序?【英文标题】:How to check if an OLEDB driver is installed on the system?如何检查系统上是否安装了 OLEDB 驱动程序? 【发布时间】:2010-09-11 22:44:54 【问题描述】:

如何确保在启动应用程序时安装了某个 OLEDB 驱动程序?我使用 Delphi 的 ADO,如果缺少驱动程序,我希望显示描述性错误消息。从 ADO 返回的错误并不总是那么用户友好。

可能有一个不错的小函数可以返回所有已安装的驱动程序,但我没有找到它。

【问题讨论】:

只是为了确保,如果您正在使用 ADO,并且您决定使用现代 MSOLEDBSQL 驱动程序(或较旧的 SQLNCLI11SQLNCLI10SQLNCLI 驱动程序),请务必在您的连接字符串中包含DataTypeCompatibility=80。 ADO 不理解现代驱动程序将返回的一些较新的DBTYPE_xxx 常量;并且微软承诺不更新 ADO - 所以没有修复。因此 SQL Server 团队添加了DataTypeCompatibility 连接字符串选项。 MSDN: Using ADO with SQL Server Native Client 【参考方案1】:

这是一个老问题,但我现在遇到了同样的问题,也许这可以帮助其他人。

在 Delphi 7 中,ADODB 中有一个过程,它返回一个带有提供程序名称的 TStringList。

使用示例:

names := TStringList.Create;
ADODB.GetProviderNames(names);

if names.IndexOf('SQLNCLI10')<>-1 then
  st := 'Provider=SQLNCLI10;'
else if names.IndexOf('SQLNCLI')<>-1 then
  st := 'Provider=SQLNCLI;'
else if names.IndexOf('SQLOLEDB')<>-1 then
  st := 'Provider=SQLOLEDB;';

【讨论】:

很高兴你能发布答案——尽管它确实是几年后的事了。【参考方案2】:

每个提供者都有一个与其类关联的 GUID。要查找 guid,请打开 regedit 并在注册表中搜索提供程序名称。例如,搜索“Microsoft Jet 4.0 OLE DB Provider”。找到它后,复制密钥(GUID 值)并在应用程序的注册表搜索中使用它。

function OleDBExists : boolean;
var
  reg : TRegistry;
begin
  Result := false;

  // See if Advantage OLE DB Provider is on this PC
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    Result := reg.OpenKeyReadOnly( '\SOFTWARE\Classes\CLSID\C1637B2F-CA37-11D2-AE5C-00609791DC73' );
  finally
    reg.Free;
  end;
end;

【讨论】:

【参考方案3】:

您可以获取 ADO 提供程序名称并在注册表中的路径 HKEY_CLASSES_ROOT\[Provider_Name] 中检查它。

【讨论】:

【参考方案4】:

最简单的方法不是在启动时尝试建立连接并捕获错误吗?

我的意思是,您可能会收到一些不同的错误,具体取决于例如用户是否在线,但您应该能够测试这些情况。

【讨论】:

【参考方案5】:

我相信有问题的 OLEDB 对象隐藏在注册表中的某个地方,因为 OLEDB / ADO 是一种 COM 解决方案。我的猜测是看看您是否可以在注册表中找到安装驱动程序的 GUID。

【讨论】:

【参考方案6】:
namespace Common 
  public class CLSIDHelper 

  [DllImport("ole32.dll")]
  static extern int CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] string lpszProgID, out Guid pclsid);


  public static Guid RetrieveGUID(string Provider) 
    Guid CLSID = Guid.Empty;
    int Ok = CLSIDFromProgID(Provider, out CLSID);
    if (Ok == 0)
       return CLSID;
    return null;
  
 

【讨论】:

以上是关于如何检查系统上是不是安装了 OLEDB 驱动程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式检查系统上是不是安装了 SQL Server Management Studio?

如何在 iOS 上检查用户设备上是不是安装了特定应用程序? [复制]

SQL Server 如何安装 OLEDB 驱动

检查 OleDb 表中是不是存在列

如何检查您的系统中是不是安装了 scikit learn? [复制]

Vista 和 Windows 7 中的 OLEDB JET 错误,而不是 XP