2008-09-22 103 views
11

如何确保在启动我的应用程序时安装了某个OLEDB驱动程序?我使用Delphi的ADO,如果驱动程序丢失,想显示一个描述性的错误信息。从ADO返回的错误并不总是那种用户友好的。如何检查系统上是否安装了OLEDB驱动程序?

有可能是一个很好的小函数,返回所有安装的驱动程序,但我还没有找到它。

回答

3

每个提供者都有一个与其类相关的GUID。要找到guid,请打开注册表并在注册表中搜索提供程序名称。例如,搜索“Microsoft Jet 4.0 OLE DB提供程序”。找到它时,复制密钥(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; 
1

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

我的意思是你可能会得到一些不同的错误,例如,用户在线,但他们是你应该能够测试的情况。

0

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

2

你可以得到一个ADO提供程序名称,并检查它在路径注册表HKEY_CLASSES_ROOT \ [PROVIDER_NAME。

0
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; 
    } 
} 
} 
6

这是一个老问题,但我现在有同样的问题,也许这可以帮助别人。

在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;'; 
+1

你很高兴发布了答案 - 即使它字面上年以后。 – 2012-09-28 17:18:41

相关问题