15.05.2009, 19:05
|
|
Модератор
|
|
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
|
|
Посмотрев на пожелания общественности набросал небольшой модуль который помогает решить проблему непонятки с с именами драйверов ODBC.
Сразу скажу - тестировал мало, поэтому могут быть баги.
Код:
unit odbc_func;
{
Модуль для получения информации о ODBC драйверах установленных в системе
(c) Aristarh Dark (2009)
e-mail: aristarh.dark@gmail.com
Зависимости:
Classes, SysUtils, Windows, Registry, StrUtils
}
{.$DEFINE debug}
interface
uses
Classes;
function GetODBCDriversNamesList(DrvNamesList:TStrings):boolean;
function GetODBCDriversList(DrvNames,DrvList:TStrings):boolean;
function GetFileExtnsByODBCDriverName(DriverName:string;var FileExtns:string):boolean;
function GetODBCDriverNameByFileExtns(FileExtns:string; var DriverName:string):boolean;
function GetODBCDriversNamesByFileExtns(FileExtns:string; DriversNames:TStrings):boolean;
implementation
uses
SysUtils, Windows,Registry, StrUtils
{$IFDEF debug}
, Dialogs
{$ENDIF}
;
function GetODBCDriversNamesList(DrvNamesList:TStrings):boolean;
{
Получение названий установленных в систему драйверов ODBC
(пользовательский уровень)
DrvNamesList - объект в который будут выгружены названия драйверов
ВОЗВРАТ - логика, говорящая об успехе операции
Aristarh Dark
2009-05-15
}
var
Reg:TRegistry;
begin
Result:=False;
Reg:=TRegistry.Create(KEY_READ);
try
if Reg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', False) then
begin
Reg.GetValueNames(DrvNamesList);
Result:=True;
end;
finally
Reg.Free;
end;
end;
function GetODBCDriversList(DrvNames,DrvList:TStrings):boolean;
{
Получение имен установленных драйверов ODBC
(пользовательский уровень)
DrvNames - список названий драйверов (см. GetODBCDriversNamesList)
DrvList - объект в который будут выгружены имена драйверов
ВОЗВРАТ - логика, говорящая об успехе операции
Aristarh Dark
2009-05-15
}
var
Reg:TRegistry;
i:integer;
begin
Result:=False;
DrvList.Clear;
Reg:=TRegistry.Create(KEY_READ);
try
if Reg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', False) then
begin
for i:=0 to DrvNames.Count-1 do
DrvList.Append(Reg.ReadString(DrvNames[i]));
Result:=True;
end;
finally
Reg.Free;
end;
end;
function GetFileExtnsByODBCDriverName(DriverName:string;var FileExtns:string):boolean;
{
Возвращает расширения файлов для драйвера ODBC
DriverName - имя драйвера ODBC (см. GetODBCDriversList)
FileExtns - переменная куда будут выгружена строка с расширениями
ВОЗВРАТ - логика, говорящая об успехе операции
Aristarh Dark
2009-05-15
}
var
Reg:TRegistry;
begin
Result:=False;
FileExtns:='';
Reg:=TRegistry.Create(KEY_READ);
try
Reg.RootKey:=HKEY_LOCAL_MACHINE;
if Reg.OpenKey(Format('\Software\ODBC\ODBCINST.INI\%s',[DriverName]), False) then
begin
FileExtns:=Reg.ReadString('FileExtns');
Result:=True;
end;
finally
Reg.Free;
end;
end;
function GetODBCDriverNameByFileExtns(FileExtns:string; var DriverName:string):boolean;
{
Возвращает название ODBC драйвера (для использование в ConnectionString (ADO))
по расширению(ям) файла базы данных
ПРИМЕЧАНИЕ: Данная функция возвращает только первый найденный драйвер
FileExtns - расширение файла в виде ".xxx" или список расширений в виде ".xxx;.yyy;.zzz"
DriverName - переменная в которую будет выгружено имя драйвера ODBC
ВОЗВРАТ - логика, говорящая об успехе операции
Aristarh Dark
2009-05-15
}
var
sl:TStringList;
DriversNamesList,DriversList:TStringList;
i,j:integer;
FileExt:string;
begin
Result:=False;
DriverName:='';
//разберем строку расширений (на случай если более одного)
sl:=TStringList.Create;
sl.Delimiter:=';';
sl.DelimitedText:=FileExtns;
{$IFDEF debug}
ShowMessage(IntToStr(sl.Count));
{$ENDIF}
//Ну и сам поиск драйвера
DriversNamesList:=TStringList.Create;
DriversList:=TStringList.Create;
if GetODBCDriversNamesList(DriversNamesList) then
if GetODBCDriversList(DriversNamesList,DriversList)then
begin
for i:=0 to DriversList.Count-1 do
begin
for j:=0 to sl.Count-1 do
if GetFileExtnsByODBCDriverName(DriversList[i],FileExt) then
if pos(Trim(sl[j]),FileExt)>0 then
begin
DriverName:=DriversNamesList[i];
Result:=True;
Break;
end;
if Length(DriverName)>0 then
Break;
end;
end;
DriversList.Free;
DriversNamesList.Free;
sl.Free;
end;
function GetODBCDriversNamesByFileExtns(FileExtns:string; DriversNames:TStrings):boolean;
{
Возвращает название всех ODBC драйверов (для использование в ConnectionString (ADO))
связанных расширением(ями) файла базы данных
FileExtns - расширение файла в виде ".xxx" или список расширений в виде ".xxx;.yyy;.zzz"
DriversNames - переменная в которую будут выгружене имена драйверов ODBC
ВОЗВРАТ - логика, говорящая об успехе операции
Aristarh Dark
2009-05-15
}
var
sl:TStringList;
DriversNamesList,DriversList:TStringList;
i,j:integer;
FileExt:string;
begin
DriversNames.Clear;
sl:=TStringList.Create;
sl.Delimiter:=';';
sl.DelimitedText:=FileExtns;
DriversNamesList:=TStringList.Create;
DriversList:=TStringList.Create;
if GetODBCDriversNamesList(DriversNamesList) then
if GetODBCDriversList(DriversNamesList,DriversList)then
for i:=0 to DriversList.Count-1 do
for j:=0 to sl.Count-1 do
if GetFileExtnsByODBCDriverName(DriversList[i],FileExt) then
if pos(Trim(sl[j]),FileExt)>0 then
DriversNames.Append(DriversNamesList[i]);
DriversList.Free;
DriversNamesList.Free;
sl.Free;
Result:=True;
end;
end.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.
Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
|