【发布时间】:2012-06-17 23:47:28
【问题描述】:
我有示例 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;
并收到异常
“算术异常、数值溢出或字符串截断”
【问题讨论】:
-
WideString表示多字节字符,您的参数设置为VARCHAR(50),通常是单字节字符。尝试使用兼容的类型。 (你真的用全部大写字母输入所有存储的过程吗?如果是这样,我很高兴我不必使用你的 SQL - 大喊使事情难以阅读。他们发明了 Shift 键是有原因的。)跨度> -
@Ken White,在 Firebird 中编写大写关键字是常见的做法。我猜这只是一个旧习惯,所以不必大喊大叫。
-
@LightBulb:除了它们不是所有的关键字。
PROCEDURE01不是关键字,“PARAMETER01”也不是。不需要大写,尤其是在 SQL 和非 SQL 语句之间不可能有歧义的存储过程中。文本,无论是 SQL 语句还是电子邮件或网络帖子中的普通句子,在全部大写时都难以阅读。 :-) 而且我并没有指责海报对我们大喊大叫,而是大喊大叫。 :-)
标签: delphi parameters firebird