你好StackOverflowers,
目前我面临的情况似乎是Delphi中TSQLConnection
对象的Database属性的最大长度。
当我打开与数据库的连接时,当我使用相当长的(154个字符)数据库名称时出现以下错误:
dbExpress Error: [0x0015]: Connection failed
SQL Server Error: unrecognized database parameter block
wrong version of database parameter block
当我将数据库文件重定位到另一个位置时(并减少路径的长度),它将连接到数据库。
我目前正在使用Object Inspector来设置TSQLConnection
对象的连接属性。
基本上,我的问题归结为:
TSQLConnection
Params
属性中设置的值的最大长度是否为this.Ignore(q => q.Creator);
this.Ignore(q => q.CreatorId);
?如果是这样,这些值的最大长度是多少?
答案 0 :(得分:4)
<强>更新强>
我找到了两种方法在一个160个字符的文件夹中打开Employee.Gdb的副本(&#39; abcdefghij0123456789&#39; x 8)。
我首先做的是编辑DBXConnections.Ini文件并更改[IBConnection]部分中的Database参数以读取
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,所以如果您不使用西雅图并且以上代码对您不起作用,请告诉我您的是哪一个使用,我会看看我是否可以尝试。
** [原始答案]
实际上,我认为这可能是其中一个DBX DLL中发生的错误。
我创建了一个160个字符的文件夹,然后将示例Employee.Gdb数据库复制到其中。 Interbase XE7的IBConsole可以毫无错误地打开数据库。因此,可以在Delphi Seattle中使用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);
&#39;文件的I / O错误&#34; database.gdb&#34; 尝试打开文件时出错 手术成功完成&#39;
并且SqlConnection的数据库参数保留在值&#39; Database.Gdb&#39;,不我指定的值,当然,也不是指定的值在IDE的参数中,它是&#39; d:\ delphi \ databases \ interbase \ employee.gdb&#39;。
我想知道我是否可以解决这个问题,方法是将驱动器转移到&#39; abcdefg ...&#39;路径。我试过这个并打开数据库为&#34; x:\ employee.gdb&#34; ,但是我的DBX应用程序中出现了同样的错误,IBConsole也无法访问数据库。
我认为你需要更短的物理路径! **
答案 1 :(得分:1)
这与MSSql Server有关:
来自Microsoft TechNet的作为一般准则,长路径名称大于160个字符 可能会导致问题。
- https://technet.microsoft.com/en-us/library/ms165768(v=sql.105).aspx