我在運行較長的腳本時遇到了 IB_Script 回傳錯誤的問題:
SQL 錯誤代碼 = -104 意外的命令列結尾 - 第 18 行,第 52 列
只要腳本中的字符數不超過 65,536 個字符(當前為 66.186 個),就不會出現此類錯誤訊息。
我使用以下代碼上傳 IB_Script:
with dm.DDLScript do
begin
try
SQL.Clear;
SQL.Add('SET TERM ^;');
SQL.Add(Format('CREATE OR ALTER PACKAGE %s', [ObjectName]));
SQL.Add('AS');
SQL.AddStrings(hdr.Lines); // hdr > TSynEdit
Execute;
SQL.Clear;
SQL.Add('SET TERM ^;');
SQL.Add(Format('RECREATE PACKAGE BODY %s', [ObjectName]));
SQL.Add('AS');
SQL.AddStrings(bdy.Lines); // bdy > TSynEdit
SQL.Add('^');
Execute;
ObjectMod := false;
except
on e:exception do
begin
messageDlg(e.Message, mtError,[mbOk], 0);
abort;
end;
end;
end;
有沒有人遇到過類似的問題?不可能以較少的字符數運行腳本,因為它是如圖所示的 PACKAGE BODY。
uj5u.com熱心網友回復:
Firebird 2.5 及更早版本僅支持 64KB(65535 位元組)的陳述句,此限制也反映在 fbclient.dll API 中,其中大小為 16 位無符號整數。Firebird 3.0 將限制增加到 10MB,但這需要 Firebird 3.0 或更高版本的 fbclient,并且要么使用新的面向物件 API,要么傳遞長度為零的陳述句,并將陳述句文本作為以 NUL 結尾的字串。
很可能,您使用的庫明確傳遞了大小,而這個大小溢位,導致 Firebird 只收到一小部分正在發送的陳述句(或者至少,我猜第 18 行第 52 列的字符數比 65535 少很多)。當 Firebird 收到不完整的陳述句時,它會產生錯誤“命令意外結束”。
我自己不會對 Delphi 進行編程,但該解決方案需要在庫中進行修改,以將陳述句傳遞給isc_dsql_prepare大小為 0 并作為 NUL 終止的字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/369762.html
上一篇:比較shell中的數字
下一篇:了解IndySocket超時
