最大长度TSQLConnection.Params值

时间:2016-02-19 09:24:32

标签: delphi interbase dbexpress

你好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); ?如果是这样,这些值的最大长度是多少?

2 个答案:

答案 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有关:

  

作为一般准则,长路径名称大于160个字符   可能会导致问题。

来自Microsoft TechNet的

- https://technet.microsoft.com/en-us/library/ms165768(v=sql.105).aspx

相关问题