当我启动我的应用程序时,如何确保安装了某个 OLEDB 驱动程序?我使用 Delphi 的 ADO,如果缺少驱动程序,我想显示描述性错误消息。从 ADO 返回的错误并不总是那么用户友好。
可能有一个不错的小函数可以返回所有已安装的驱动程序,但我还没有找到它。
这是一个老问题,但我现在遇到了同样的问题,也许这可以帮助其他人。
在 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;';
每个提供程序都有一个与其类关联的 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;
您可以获取 ADO 提供程序名称并在注册表中的路径 HKEY_CLASSES_ROOT\[Provider_Name] 中检查它。
最简单的方法不是尝试在启动时建立连接并捕获错误吗?
我的意思是你可能会得到一些不同的错误,例如,用户在线,但它们是你应该能够测试的情况。
我相信有问题的 OLEDB 对象被埋在注册表中的某个地方,因为 OLEDB / ADO 是一个 COM 解决方案。我的猜测是看看您是否可以在注册表中找到安装驱动程序的 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;
}
}
}