1

我有示例 firebird 存储过程

PROCEDURE PROCEDURE01
RETURNS (
 PARAMETER01 VARCHAR(50))
AS 
BEGIN
  PARAMETER01 = 'Hello';
END

在德尔福方面

LCommand := SQLConnection1.DBXConnection.CreateCommand;
LCommand.CommandType := TDBXCommandTypes.DbxStoredProcedure;
LCommand.Text := 'PROCEDURE01';
LIdOut := LCommand.CreateParameter;
LIdOut.ParameterDirection := TDBXParameterDirections.OutParameter;
LIdOut.DataType := TDBXDataTypes.WideStringType;
LIdOut.Name := 'PARAMETER01';
LCommand.Parameters.AddParameter(LIdOut);
LCommand.Prepare;
LReader := LCommand.ExecuteQuery;

并收到异常

“算术异常、数值溢出或字符串截断”

4

3 回答 3

4

这似乎是TDBXCommand(或者可能是 Dbexpress firebird 驱动程序)的限制,因为使用其他类型的输出参数都可以正常工作。作为解决方法,您可以使用TSQLStoredProc该类。

试试这个样本。

var
 LSQLStoredProc :  TSQLStoredProc;
begin
  LSQLStoredProc:=TSQLStoredProc.Create(nil);
  try
    LSQLStoredProc.SQLConnection:=SQLConnection1;
    LSQLStoredProc.StoredProcName:='PROCEDURE01';
    LSQLStoredProc.ExecProc;
    ShowMessage(LSQLStoredProc.ParamByName('PARAMETER01').AsString);
  finally
    LSQLStoredProc.Free;
  end;
end;
于 2012-06-15T13:53:57.073 回答
1

以将数据库设置为 UTF-8 为例。

CREATE DATABASE localhost:mybase
  USER SYSDBA
  PASSWORD masterkey
  PAGE_SIZE 8192
  DEFAULT CHARACTER SET UTF8;
  SET NAMES ISO8859_1;

CREATE TABLE scales (
  ID ...,      
  byteken VARCHAR(50) COLLATE DE_DE,

查看我对算术异常、数字溢出或字符串截断的回答

于 2012-06-15T20:25:45.873 回答
-1

首先在存储过程中将“SUSPEND”放在“END”之前

于 2012-06-15T03:33:41.033 回答