Используя корпоративную версию XE2, которая включает встроенную поддержку dbExpress ODBC, я успешно создал «Соединение», где имя базы данных является именем системного DSN, а пароль - паролем базы данных MS Access.
Я могу щелкнуть «Проверить соединение» на странице «Изменить соединение», и в обозревателе баз данных появится сообщение «Тестовое соединение выполнено успешно».
Перетаскивание соединения из проводника данных создает соединение TSQLConnection со свойством Driver, установленным на ODBC, а коллекция Params:
drivername=ODBC
database=myaccessdbDSN
password=accessdbpwd
Хотя это отлично подходит для тестирования, я бы предпочел не требовать создания системного DSN ODBC для его работы.
Насколько я помню, DSN можно просто заменить ConnectionString правильного формата, и обычно его можно определить, просмотрев текст DSN. К сожалению, проводник данных в XE2 работает только с системными DSN, а не с файловыми DSN.
Какой должна быть ConnectionString TSQLConnection при использовании ODBC для подключения к файлу базы данных MS Access?
ИЗМЕНИТЬ 1
Учитывая форму с сеткой привязки к данным, TDataSource, TSQLQuery с соответствующей командой SQL и частное соединение TSQLConnection (не компонент формы), работает следующее:
FSQLConnection := TSQLConnection.Create(nil);
FSQLConnection.DriverName := 'ODBC';
FSQLConnection.LoginPrompt := false;
FSQLConnection.Params.Values['Database'] := 'myaccessdbDSN';
FSQLConnection.Params.Values['Password'] := 'accessdbpwd';
FSQLConnection.Connected := true;
SQLQuery1.SQLConnection := FSQLConnection;
SQLQuery1.Active := true;
Я вижу результаты запроса в сетке.
Что мне нужно сделать, так это заменить myaccessdbDSN на строку подключения. Если я сделаю следующее, что, по-видимому, должно работать, я получаю сообщение об ошибке «Не удалось открыть соединение» в диспетчере драйверов ODBC.
FSQLConnection := TSQLConnection.Create(nil);
FSQLConnection.DriverName := 'ODBC';
FSQLConnection.LoginPrompt := false;
FSQLConnection.Params.Values['ConnectionString'] := 'Provider=Microsoft.ACE.OLEDB.12.0;'+
'Data Source=myaccessdb.mdb;'+
'Jet OLEDB:Database Password=accessdbpwd;';
FSQLConnection.Connected := true;
SQLQuery1.SQLConnection := FSQLConnection;
SQLQuery1.Active := true;
Обратите внимание, что обычно при установке свойства DriverName во время выполнения необходимо установить некоторые другие свойства, которые обычно определяются в файле dbxdrivers.ini. Если для DriverName задано значение «MSSQL», это:
GetDriverFunc=getSQLDriverMSSQL
LibraryName=dbxmss.dll
VendorLib=sqlncli10.dll
Но если для DriverName задано значение «ODBC», они будут пустыми. Это ошибка dbxDriver для ODBC или нет?
Я просмотрел справку по адресу http://docwiki.embarcadero.com/RADStudio/Berlin/en/Setting_Up_TSQLConnection, но он не сообщает мне ничего, что я еще не пробовал, и наполняет меня уверенностью, когда предложение
Чтобы открыть редактор подключений, дважды щелкните компонент TSQLConnection.
не работает в XE2, XE5, Сиэтле или Берлине.
ИЗМЕНИТЬ 2
Я смотрю на это потому, что драйвер Open ODBC dbxExpress больше не работает в Берлине. В XE2 будет работать следующее:
FSQLConnection.DriverName := 'DbxOpenOdbc';
FSQLConnection.GetDriverFunc := 'getSQLDriverODBCW';
FSQLConnection.LibraryName := 'dbxoodbc.dll';
FSQLConnection.VendorLib := 'odbcjt32.dll';
FSQLConnection.Params.Values['DriverPackageLoader'] := 'TDBXDynalinkDriverLoaderOpenOdbc';
FSQLConnection.Params.Values['IsolationLevel'] := 'ReadCommitted';
FSQLConnection.Params.Values['RowSetSize'] := '20';
FSQLConnection.Params.Values['Database'] := '?';
FSQLConnection.Params.Values['ConnectionString'] := 'DRIVER={Microsoft Access Driver (*.mdb)};'+
'DBQ=myaccessdb.mdb;'+
'UID=;'+
'PWD=accessdbpwd;'+
'DriverId=25;'+
'FIL=MS Access;';
Но когда тот же код запускается в Берлине, я получаю ошибку «Дубликаты запрещены» от AddCommandFactory, которая связана с этим кодом в модуле Dbx34Drv, как показано ниже:
constructor TDbxOpenOdbcDriver.Create(DriverDef: TDBXDriverDef);
begin
{$IF CompilerVersion > 18.50}
inherited Create(DriverDef, TDBXDynalinkDriverLoader);
InitDriverProperties(TDBXOpenOdbcProperties.Create(DriverDef.FDBXContext));
// '' makes this the default command factory.
AddCommandFactory('', CreateCommandOpenOdbc);
//AddCommandFactory(TDBXCommandTypes.DbxMetaData
{$ELSE}
raise EDbxOODBCDriverError.Create('Not Implemented: TDbxOpenOdbcDriver.Create(DriverDef: TDBXDriverDef)');
{$IFEND}
end;
Поскольку драйвер Open ODBC dbxExpress не поддерживается с 2013 года, а XE2 и Berlin Enterprise поставляются со своим собственным драйвером ODBC dbxExpress (Data.DBXOdbc), я хочу изменить свойства и параметры, чтобы получить код, работающий в XE2. для работы с собственным драйвером ODBC, а затем проверьте, работает ли он в Берлине.
Тема на https://sourceforge.net/p/open-dbexpress/discussion/119359/thread/703de7d9/ указывает, что нужно просто заменить значения Open ODBC на обычные ODBC.
Таблица по адресу http://docwiki.embarcadero.com/RADStudio/Berlin/en/DbExpress_Supported_Database_Management_Systems не содержит никаких библиотек для Odbc, поэтому я предполагаю, что это будет пустым.
ИЗМЕНИТЬ 3 (И ОТВЕТИТЬ)
Поработав с кодом, я получил следующие возможности для работы как в XE2 Enterprise, так и в Berlin Enterprise, чтобы открыть базу данных MS Access с объектом TSQLConnection, используя собственный драйвер ODBC dbxExpress.
FSQLConnectionAccess.DriverName := 'ODBC';
FSQLConnectionAccess.GetDriverFunc := 'getSQLDriverODBCW';
FSQLConnectionAccess.LibraryName := '';
FSQLConnectionAccess.VendorLib := 'odbcjt32.dll';
FSQLConnectionAccess.Params.Values['DriverPackageLoader'] := 'TDBXOdbcDriverLoader';
FSQLConnectionAccess.Params.Values['IsolationLevel'] := 'ReadCommitted';
FSQLConnectionAccess.Params.Values['RowSetSize'] := '20';
FSQLConnectionAccess.Params.Values['Database'] := '?';
FSQLConnectionAccess.Params.Values['ConnectionString'] := 'DRIVER={Microsoft Access Driver (*.mdb)};'+
'DBQ=myaccessdb.mdb;'+
'UID=;'+
'PWD=accessdbpwd;'+
'DriverId=25;'+
'FIL=MS Access;';
Обратите внимание на то, что используемая строка подключения не похожа на строки, показанные на http://www.connectionstrings.com, которые это основная причина, по которой я не использую этот сайт для разработки Delphi.
Аналогичное изменение требуется, если вы использовали драйвер DevArt SQL Server и хотите перейти на собственный драйвер MS SQL Server:
// FSQLConnectionSQL.DriverName := 'DevArtSQLServer';
// FSQLConnectionSQL.GetDriverFunc := 'getSQLDriverSQLServer';
// FSQLConnectionSQL.LibraryName := 'dbexpsda40.dll';
// FSQLConnectionSQL.VendorLib := 'sqloledb.dll';
становится
FSQLConnectionSQL.DriverName := 'MSSQL';
FSQLConnectionSQL.GetDriverFunc := 'getSQLDriverMSSQL';
FSQLConnectionSQL.LibraryName := 'dbxmss.dll';
FSQLConnectionSQL.VendorLib := 'sqlncli10.dll';
Причина, по которой мы использовали драйверы Open ODBC и DevArt SQL Server, заключается в том, что изначально у нас был XE2 Professional, который не включал драйверы ODBC или SQL в качестве стандарта. Теперь, когда мы используем Enterprise, это больше не проблема. Осталось только определить, по-разному ли ведут себя старые и новые драйверы.