如何確保在啓動我的應用程序時安裝了某個OLEDB驅動程序?我使用Delphi的ADO,如果驅動程序丟失,想顯示一個描述性的錯誤信息。從ADO返回的錯誤並不總是那種用戶友好的。如何檢查系統上是否安裝了OLEDB驅動程序?
有可能是一個很好的小函數,返回所有安裝的驅動程序,但我還沒有找到它。
如何確保在啓動我的應用程序時安裝了某個OLEDB驅動程序?我使用Delphi的ADO,如果驅動程序丟失,想顯示一個描述性的錯誤信息。從ADO返回的錯誤並不總是那種用戶友好的。如何檢查系統上是否安裝了OLEDB驅動程序?
有可能是一個很好的小函數,返回所有安裝的驅動程序,但我還沒有找到它。
每個提供者都有一個與其類相關的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;
難道最簡單的方法就是嘗試在啓動時建立連接並捕獲錯誤?
我的意思是你可能會得到一些不同的錯誤,例如,用戶在線,但他們是你應該能夠測試的情況。
我相信有問題的OLEDB對象被埋在註冊表的某處,因爲OLEDB/ADO是一個COM解決方案。我的猜測是看你是否可以找到你的驅動程序安裝在註冊表中的GUID。
你可以得到一個ADO提供程序名稱,並檢查它在路徑註冊表HKEY_CLASSES_ROOT \ [PROVIDER_NAME。
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;
}
}
}
這是一個老問題,但我現在有同樣的問題,也許這可以幫助別人。
在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;';
你很高興發佈了答案 - 即使它字面上年以後。 – 2012-09-28 17:18:41