...
...

Секреты Delphi. Соединение с базами данных при помощи компонент ADO

Секреты Delphi. Соединение с базами данных при помощи компонент ADO

Продолжая тему использования компонент ADO, хочется обратить ваше внимание на удобный способ настройки соединений к БД с использованием внешних файлов, описывающих параметры соединения.

Если у вас версия ОС Windows 98, то для работы с ADO желательно предварительно скачать пакет обновления Microsoft Data Access Components; это файл mdac_typ. exe. На 95-й версии потребуется установка dcom95.exe.
В Windows-системах для файлов описания ADO-соединений зарезервировано расширение udl. Просто создаем пустой файл с данным расширением и запускаем его. Перед нами должен появиться мастер настройки соединений, пример работы с которым показан на рисунках 1 и 2.
После завершения настройки параметров соединения созданный нами файл можно использовать для настройки параметров соединения в компоненте TADOConnection.

Рис 1 Пример выбора поставщика данных


Рис 2 Пример настройки параметров соединения

Рассмотрим следующую структуру организации каталогов проекта:
Project catalog | +-bin +-connections

Исполняемый файл проекта будем размещать в каталоге /bin, а файлы описания соединений с БД поместим в каталог /connections. Тогда путь к файлам соединений можно определить используя следующий код:

uses
OLEDB, ActiveX, ADOInt, ComObj,StrUtils; 
//Библиотека компонен
т RX
... сonnectionsPath:=UpperCase(IncludeTrailingBackslash(ExtractFilePath(Application.Ex
eName))); сonnectionsPath:=ReplaceStr(сonnectionsPath,'\BIN\','\CONNECTIONS\');

Функция установления соединения может иметь вид:

function
TDM.Login:boolean; 
var
udlList : TStringList; mor
eFiles : boolean; SearchRec : TSearchRec; isFolder, isDotOrDotdot, isValidFile : boolean; fName : 
String
; 
begin
result:=false;udlList:=TStringList.Create; 
//Список доступных файлов, описывающих соединения с БД

try
udlList.Clear
; 
//Сканируем каталог

if
DirectoryExists(gConnectionsPath) 
then

//Добавляем backslash по необходимости
gConnectionsPath := Inclu
deTrailingBackslash(gConnectionsPath); 
//сканируем дочерние каталоги
moreFiles := 
(FindFirst (gConnectionsPath + '*.udl', faAnyFile, SearchRec) = 0); 
if
(moreFiles)
 
then

try

while
(moreFiles) 
do

begin
isValidFile := 
true
; 
//Определяем, это файл и
ли каталог
isFolder := (SearchRec.Attr 
and
faDirectory <> 0); 
if
(isFolder) 
then

begin

//игнорируем если
 . или ..
isDotOrDotdot := (SearchRec.Name[1] = '.'); 
if
(isDotOrDotdot) 

then
isValidFile := 
false
; 
end
; 
//д
обавляем файл в список

if
(isValidFile) 
then

b
egin
fName:=Copy(SearchRec.Name,1,Pos('.',SearchRec.Name)-1); udlList.Add(fName); end; <
r>
//продолжаем сканирование
moreFiles := (FindNext(SearchRec) = 0); end; 
finall
y
FindClose(SearchRec); 
end
; 
try

//Запрос диа
лога выбора пароля и файла соединения с БД

if
ShowPasswordDlg( gLogonUser
Name, gLogonUserPassword, gLogonDataBase, udlList) 
then

try
Scre
en.Cursor:=crHourGlass; dbConnection.Connected:=False; SetMainConnectionSettings(gLogonUserName, gLo
gonUserPassword, gLogonDataBase); dbConnection.Connected:=True; Result:=DMR.Get_DatabaseConnectStatu
s; 
finally
Screen.Cursor:=crDefault; 
end
; 
except

on
E: Exception 
do

begin
LogError(E.Messag
e,['']); result:=false; 
end
; 
end
; 
finally
ud
lList.Free;
end
; 
end
; . . . 
procedure
TDM.Set
MainConnectionSettings( const aLogonUserName, aLogonPassword, aLogonDatabase:
String
<
n>); 
var
i:integer; tmpStr:String; dataInit: IDataInitialize; dataLinkFileName: Wi
deString; innerConnStr: POleStr; 
begin
dbConnection.Connected:=false; tmpStr:=CT_F
ILENAME+IncludeTrailingBackslash(gConnectionsPath)+aLogonDatabase+'.udl'; 
//Загружаем парам
етры соединения из файла

if
CompareText(Copy(tmpStr, 1, 10), CT_FILENAME)
 = 0 
then

begin
dataInit := CreateComObject(CLSID_DataLinks) 

as
IDataInitialize; dataLinkFileName := Copy(tmpStr, 11, MAX_PATH); 
if
Succeeded(dataInit.LoadStringFromStorage(PWideChar(DataLinkFileName), innerConnStr)) 
th
en
tmpStr := innerConnStr; 
end

else
tmpStr:='Provider=M
SDASQL.1;'+'Persist Security Info=True;'; dbConnection.DefaultDatabase:=''; dbConnection.ConnectionS
tring:=tmpStr; 
for
i:=0 
to
dbConnection.Properties.Count-1 
do

begin

if
(dbConnection.Properties[i].Name='Passw
ord') 
and 
(
String
(DbConnection.Properties[i].Value)<> aL
ogonPassword ) 
then
dbConnection.Properties[i].Set_Value(aLogonPassword) 
else

if
(dbConnection.Properties[i].Name='User ID') 
and 
<
n>(
String
(DbConnection.Properties[i].Value)<> aLogonUserName) 
then

DbConnection.Properties[i].Set_Value(aLogonUserName) 
else

if
(DbConnection.Properties[i].Name='Data Source') 
and
(
String
(DbConnection.Properties[i].Value)<> aLogonDatabase) 
and 
(tmpStr = 'Prov
ider=MSDASQL.1;'+'Persist Security Info=True;') 
then
dbConnection.Properties[i].Se
t_Value(aLogonDatabase); 
end
; 
end
; 

Дополнительную функциональность программе можно придать используя функцию корректировки соединения EditConnectionString, расположенную в модуле $(DELPHI)\Source\Property Editors\AdoConEd.pas. Например:

procedure
TfrmMain.actSetConnectionStringExecute(Sender: TObject); 
begin
DM.dbConnection.Close; EditConnectionString(DM.dbConnection); 
end;

Сергей Бердачук, Berdachuk@tut.by, http://bs_elbis.at.tut.by


© Компьютерная газета

полезные ссылки
Корпусные камеры видеонаблюдения
IP камеры видеонаблюдения