Обновить
Я нашел два способа открыть копию Employee.Gdb в папке со 160-символьным именем ('abcdefghij0123456789' x 8).
Сначала я отредактировал файл DBXConnections.Ini и изменил параметр базы данных в разделе [IBConnection] на чтение
Database=localhost:D:\abcdefghij01234567890abcdefghij01234567890abcdefghij01234567890abcdefghij01234567890abcdefghij01234567890abcdefghij01234567890abcdefghij01234567890abcdefghij01234567890\employee.gdb
Затем я могу успешно подключиться к нему, открыть Employee.Gdb и внести изменения в таблицу Customer. Я проверил изменения в IBConsole на случай, если копия Employee.Gdb окажется не той, что я предполагал.
Впоследствии я обнаружил, что могу создавать и открывать базу данных в коде с помощью Delphi Seattle и Interbase XE7 следующим образом:
function LongPath : String;
begin
Result := 'D:\' + DupeString('abcdefghij0123456789', 8);
end;
function LongDBName : String;
begin
Result := LongPath + '\Employee.Gdb';
end;
procedure TForm1.OpenDB;
var
Ini : TMemIniFile;
const
scDBXConIni = 'C:\Users\Public\Documents\Embarcadero\Studio\dbExpress\17.0\dbxconnections.ini';
scSourceDB = 'D:\Delphi\Databases\Interbase\Employee.Gdb';
begin
Ini := TMemIniFile.Create(scDBXConIni);
try
// First, blank out the Database value in the IBConnection section
// of DBXConnections.Ini
Ini.WriteString('IBConnection', 'Database', '');
Ini.UpdateFile;
// Next, create the long-named directory and copy Employee.Gdb to it
if not DirectoryExists(LongPath) then
MkDir(LongPath);
Assert(CopyFile(PChar(scSourceDB), PChar(LongDBName), False));
// Set LoadParamsOnConnect to False so that the SqlConnection uses
// the value of the Database we are about to give it
SqlConnection1.LoadParamsOnConnect := False;
SqlConnection1.Params.Values['Database'] := LongDBName;
SqlConnection1.Connected := True;
// Open the CDS to view the data
CDS1.Open;
finally
Ini.Free;
end;
end;
Важным шагом в этом способе является установка LoadParamsOnConnect
на False
, что, признаюсь, я упустил из виду в предыдущих попытках заставить этот код работать.
У меня есть более ранние версии Delphi на этом компьютере, поэтому, если вы не используете Сиэтл и приведенный выше код не работает, сообщите мне, какую из них вы используете, и я посмотрим, смогу ли я попробовать это.
**[Исходный ответ]
На самом деле, я думаю, что это может быть ошибка, возникающая в одной из DLL DBX.
Я создал папку со 160-символьным именем, затем скопировал в нее демонстрационную базу данных Employee.Gdb. IBConsole Interbase XE7 может открыть базу данных без ошибок. То же самое можно сказать и о небольшом тестовом проекте с использованием компонентов IBX в Delphi Seattle.
Однако с эквивалентным проектом DBX, когда я использую приведенный ниже код
procedure TForm1.Button1Click(Sender: TObject);
begin
SqlConnection1.Params.Values['database'] := 'D:\abcdefghij01234567890abcdefghij01234567890abcdefghij01234567890abcdefghij01234567890abcdefghij01234567890abcdefghij01234567890abcdefghij01234567890abcdefghij01234567890\employee.gdb';
SqlConnection1.Connected := True;
end;
я получаю ошибку в
procedure TDBXDynalinkConnection.DerivedOpen;
var
Count: TInt32;
Names: TWideStringArray;
Values: TWideStringArray;
IsolationLevel: Longint;
DBXError: TDBXErrorCode;
begin
Count := FConnectionProperties.Properties.Count;
FConnectionProperties.GetLists(Names, Values);
CheckResult(FMethodTable.FDBXConnection_Connect(FConnectionHandle, Count, Names, Values));
DBXError := FMethodTable.FDBXConnection_GetIsolation(FConnectionHandle, IsolationLevel);
"Ошибка ввода-вывода для файла "database.gdb" Ошибка при попытке открыть файл Операция успешно завершена"
и параметр базы данных SqlConnection остается со значением «Database.Gdb», что не значение, которое я указал, конечно, и не значение, указанное в параметрах в IDE, что был 'd:\delphi\databases\interbase\employee.gdb'.
Я задавался вопросом, могу ли я обойти эту проблему, SUBSTing диск на путь «abcdefg…». Я попробовал это и открыл базу данных как "x:\employee.gdb" , но я получаю ту же ошибку в своем приложении DBX, а также IBConsole не может получить доступ к базе данных.
Я думаю, вам нужен более короткий физический путь!**
person
MartynA
schedule
19.02.2016
TSQLConnections.Params
равноTStrings
, поэтому, если здесь есть ограничение, это ограничение TStrings. edn.embarcadero.com/article/30333 - person Val Marinov   schedule 19.02.2016connected
значениеtrue
. - person RFerwerda   schedule 22.02.2016