gpt4 book ai didi

delphi - 最大长度 TSQLConnection.Params 值

转载 作者:行者123 更新时间:2023-12-03 15:49:49 28 4
gpt4 key购买 nike

StackOverflowers 的 friend 们大家好,

目前我面临的情况是,Delphi 中的 TSQLConnection 对象的 Database 属性似乎有最大长度。

当我打开与数据库的连接时,如果使用相当长(154 个字符)的数据库名称,则会出现以下错误:

dbExpress 错误:[0x0015]:连接失败
SQL Server 错误:无法识别的数据库参数 block
数据库参数 block 版本错误

当我将数据库文件重新定位到另一个位置(并减少路径长度)时,它将连接到数据库。

我当前正在使用对象检查器来设置 TSQLConnection 对象的连接属性。

基本上,我的问题可以归结为:

TSQLConnection 是否有 Params 属性中设置的值的最大长度?如果是,这些值的最大长度是多少?

最佳答案

更新

我找到了两种方法来打开名称为 160 个字符的文件夹中的 Employee.Gdb 副本 ('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 的一些早期版本,因此,如果您不使用 Seattle 并且上述代码对您不起作用,请告诉我您正在使用哪个版本,然后我看看是否可以尝试一下。

**[原始答案]

实际上,我认为这可能是 DBX DLL 之一中发生的错误。

我创建了一个名称包含 160 个字符的文件夹,然后将演示 Employee.Gdb 数据库复制到其中。 Interbase XE7的IBConsole可以打开数据库,没有错误。在德尔福西雅图使用 IBX 组件构建的小型测试项目也可以。

但是,对于等效的 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”的 I/O 错误尝试打开文件时出错操作成功完成'

并且 SqlConnection 的数据库参数保留为“Database.Gdb”值,当然,它不是我指定的值,也不是在 params 中指定的值IDE,即“d:\delphi\databases\interbase\employee.gdb”。

我想知道是否可以通过将驱动器替换为“abcdefg ...”路径来解决此问题。我尝试了这一点并将数据库打开为 "x:\employee.gdb",但我在 DBX 应用程序中遇到了相同的错误,而且 IBConsole 也无法访问数据库。

我认为你需要一条更短的物理路径!**

关于delphi - 最大长度 TSQLConnection.Params 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35501665/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com