Как проверить, установлен ли в системе драйвер OLEDB?
Как я могу убедиться, что определенный драйвер OLEDB установлен при запуске приложения? Я использую ADO из Delphi и хотел бы отобразить описательное сообщение об ошибке, если драйвер отсутствует. Ошибка, возвращаемая из ADO, не всегда удобна для пользователя.
Есть, вероятно, небольшая функция, которая возвращает все установленные драйверы, но я ее не нашел.
Ответы
Ответ 1
У каждого провайдера есть GUID, связанный с его классом. Чтобы найти руководство, откройте regedit и найдите в реестре имя поставщика. Например, найдите "Поставщик OLE DB для Microsoft Jet 4.0". Когда вы его найдете, скопируйте ключ (значение 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;
Ответ 2
Это старый вопрос, но сейчас у меня такая же проблема, и, возможно, это может помочь другим.
В 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;';
Ответ 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;
}
}
}