История переиздания | ||
---|---|---|
Издание 1.0 | 2003.12.25 |
Продолжая тему использования компонент ADO, хочется обратить ваше внимание об удобном способе настройки соединений к БД с использованием внешних файлов, описывающих параметры соединения.
Если у вас версия ОС Windows 98, то для работы с ADO желательно предварительно скачать пакет обновления Microsoft Data Access Components, это файл mdac_typ.exe. На 95-й версии потребуется установка dcom95.exe.
В Windows системах для файлов описания ADO соединений зарезервировано расширение “udl”. Просто создаем пустой файл с данным расширением, и запускаем его. Перед нами должен появиться мастер настройки соединений, пример работы с которым показан на рисунках 1 и 2.
Рисунок 1. выбор поставщика данных
Рисунок 2. настройка параметров соединения
После завершения настройки параметров соединения, созданный нами файл можно использовать для настройки параметров соединения в компоненте TADOConnection.
Рассмотрим следующую структуру организации каталогов проекта:
Project catalog | +-bin +-connections
Исполняемый файл проекта будем размещать в каталоге /bin, а файлы описания соединений с БД поместим в каталог /connections. Тогда путь к файлам соединений можно определить используя следующий код:
uses OLEDB, ActiveX, ADOInt, ComObj, StrUtils; //Библиотека компонент RX ... сonnectionsPath:=UpperCase(IncludeTrailingBackslash(ExtractFilePath(Application.ExeName))); сonnectionsPath:=ReplaceStr(сonnectionsPath,'\BIN\','\CONNECTIONS\'); Функция установления соединения может иметь вид: function TDM.Login:boolean; var udlList : TStringList; moreFiles : boolean; SearchRec : TSearchRec; isFolder, isDotOrDotdot, isValidFile : boolean; fName : String; begin result:=false; udlList:=TStringList.Create; //Список доступных файлов, описывающих соединения с БД try udlList.Clear; //Сканируем каталог if DirectoryExists(gConnectionsPath) then //Добавляем backslash по необходимости gConnectionsPath := IncludeTrailingBackslash(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 begin fName:=Copy(SearchRec.Name,1,Pos('.',SearchRec.Name)-1); udlList.Add(fName); end; //продолжаем сканирование moreFiles := (FindNext(SearchRec) = 0); end; finally FindClose(SearchRec); end; try //Запрос диалога выбора пароля и файла соединения с БД if ShowPasswordDlg( gLogonUserName, gLogonUserPassword, gLogonDataBase, udlList) then try Screen.Cursor:=crHourGlass; dbConnection.Connected:=False; SetMainConnectionSettings(gLogonUserName, gLogonUserPassword, gLogonDataBase); dbConnection.Connected:=True; Result:=DMR.Get_DatabaseConnectStatus; finally Screen.Cursor:=crDefault; end; except on E: Exception do begin LogError(E.Message,['']); result:=false; end; end; finally udlList.Free; end; end; . . . procedure TDM.SetMainConnectionSettings( const aLogonUserName, aLogonPassword, aLogonDatabase:String); var i:integer; tmpStr:String; dataInit: IDataInitialize; dataLinkFileName: WideString; innerConnStr: POleStr; begin dbConnection.Connected:=false; tmpStr:=CT_FILENAME+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)) then tmpStr := innerConnStr; end else tmpStr:='Provider=MSDASQL.1;'+'Persist Security Info=True;'; dbConnection.DefaultDatabase:=''; dbConnection.ConnectionString:=tmpStr; for i:=0 to dbConnection.Properties.Count-1 do begin if (dbConnection.Properties[i].Name='Password') and (String(DbConnection.Properties[i].Value)<> aLogonPassword ) then dbConnection.Properties[i].Set_Value(aLogonPassword) else if (dbConnection.Properties[i].Name='User ID') and (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 = 'Provider=MSDASQL.1;'+'Persist Security Info=True;') then dbConnection.Properties[i].Set_Value(aLogonDatabase); end; end;
Дополнительную функциональность программе можно придать используя функцию корректировки соединения EditConnectionString, расположенную в модуле $(DELPHI)\Source\Property Editors\AdoConEd.pas. Например:
procedure TfrmMain.actSetConnectionStringExecute(Sender: TObject); begin DM.dbConnection.Close; EditConnectionString(DM.dbConnection); end;