Секреты 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 Пример настройки параметров соединения
Рассмотрим следующую структуру организации каталогов проекта:
Исполняемый файл проекта будем размещать в каталоге /bin, а файлы описания соединений с БД поместим в каталог /connections. Тогда путь к файлам соединений можно определить используя следующий код:
Функция установления соединения может иметь вид:
Дополнительную функциональность программе можно придать используя функцию корректировки соединения EditConnectionString, расположенную в модуле $(DELPHI)\Source\Property Editors\AdoConEd.pas. Например:
Сергей Бердачук, Berdachuk@tut.by, http://bs_elbis.at.tut.by
Продолжая тему использования компонент 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 ; excepton 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
Компьютерная газета. Статья была опубликована в номере 02 за 2004 год в рубрике программирование :: delphi