OLEDB ドライバーがシステムにインストールされているかどうかを確認するにはどうすればよいですか?
質問
アプリケーションの起動時に特定の OLEDB ドライバーがインストールされていることを確認するにはどうすればよいですか?Delphi の ADO を使用しており、ドライバーが見つからない場合に説明的なエラー メッセージを表示したいと考えています。ADO から返されるエラーは、必ずしもユーザーにとって使いやすいものではありません。
おそらく、インストールされているすべてのドライバーを返す優れた小さな関数があると思いますが、私はそれを見つけませんでした。
解決
各プロバイダーには、そのクラスに関連付けられた 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;
他のヒント
これは古い質問ですが、私は今同じ問題を抱えていたので、これは他の人にも役立つかもしれません。
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;';
ADO プロバイダー名を取得し、レジストリのパス HKEY_CLASSES_ROOT\[Provider_Name] で確認できます。
最も簡単な方法は、起動時に接続を試みてエラーをキャッチすることではないでしょうか?
たとえば、ユーザーがオンラインであるかどうかに応じて、いくつかの異なるエラーが返される可能性がありますが、それらはテストできるケースです。
OLEDB / ADO は COM ソリューションであるため、問題の OLEDB オブジェクトはレジストリのどこかに埋められていると思います。私の推測では、ドライバーがレジストリにインストールされている GUID を見つけることができるかどうかを確認することです。
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;
}
}
}