【问题标题】:Delphi XE: TSQLQuery raises "Input parameter mismatch"Delphi XE:TSQLQuery 引发“输入参数不匹配”
【发布时间】:2014-01-16 21:15:40
【问题描述】:

我在 Firebird 2.5 中创建了一个存储过程 (SP_TEST),它返回一个选择并使用 3 个输入参数。 这个SP_TEST 在 IBExpress 中工作正常,当我输入例如SQL 命令:select * from SP_TEST(1,2,3) 有正确的结果。

但是,当我使用 Delphi XE 中的 dbExpress 组件进行相同的选择时,会出现“输入参数不匹配”的消息。 我正在使用 TSQLQuery 组件,CommandText 属性设置为"select * from SP_TEST(1,2,3)"。 当我在 CommandText 属性中定义与在SP_TEST 中定义的相同查询时,我得到了一个不错的结果。 但是在 select 语句中包含存储过程名称(带有正确数量的参数)会引发此错误消息。

谁能告诉我我做错了什么?

更新 - 从伪答案移出并添加格式:https://stackoverflow.com/editing-help

SET TERM ^ ;
ALTER PROCEDURE SP_TEST (
    NJAAR Integer,
    NMAAND Integer,
    CREKNR Varchar(6) )
RETURNS (
    TOTAAL Numeric(15,2),
    CODE Varchar(4),
    OMSCHR Varchar(40),
    RICHTING Varchar(3),
    PROG Numeric(18,2),
    TRANS Numeric(18,2) )
AS
BEGIN
  FOR
    SELECT a.CODE, a.OMSCHR, a.RICHTING,
    SUM(iif(richting='AF',-1,1) * COALESCE(p.bedrag,0)) as prog,
    SUM(iif(richting='AF',-1,1) * COALESCE(t.bedrag,0)) as trans,
    0 as totaal
    FROM POSTEN a
    left JOIN prognose p on p.POST = a.CODE and p.JAAR = :nJAAR and p.MAAND = :nMAAND
    left JOIN TRANSACT t on t.POST = a.CODE and EXTRACT(YEAR FROM t.datum) = :nJAAR and EXTRACT(MONTH FROM t.datum) = :nMAAND
    WHERE REKTOEPAS containing :cREKNR
    GROUP by a.CODE, a.OMSCHR, a.RICHTING
    INTO :CODE,
         :OMSCHR,
         :RICHTING,
         :PROG,
         :TRANS,
         :TOTAAL
  DO
  BEGIN
    totaal = iif(abs(prog) > abs(trans),prog,trans);
    SUSPEND;
  END
END^
SET TERM ; ^

在IBExpert中输入语句:

SELECT * FROM SP_TEST(2014,1,'0001')

返回多行的结果集。

当我将相同的查询传递给TSQLQuery.CommandText(或SQL 属性,我也尝试过)时,会出现“输入参数不匹配”消息。

我尝试了TSQLStoredProc,但是当我使用 Open 方法时,出现一条消息“光标未从查询返回”。

事实上,我的存储过程是一种视图,我喜欢我的 dbExpress 组件(TSQLQueryTSQLStoredProc)中的结果。 如前所述,当我将完整的 SQL 代码放在 TSQLQuery.SQL 属性中的“SELECT ...”和“GROUP BY”之间时,我得到了结果行。到目前为止,使用存储过程失败。

【问题讨论】:

  • 我很困惑。您说使用 SQL 命令 'select * from PROC()` 有效,但使用 select * from SP_TEST() 的命令失败。它们是两种不同的语句(一种使用PROC(),另一种使用SP_TEST())。您能edit 解释您遇到的实际问题吗?
  • 本应执行 sp_test(1,2,3) ...
  • SSCCE.org 显示代码。显示 SP 的声明。展示您如何安排 TSQLQuery、您更改的所有属性以及如何打开它 - 一切。我们无法猜测我们看不到的东西。并显示准确的逐字错误文本。您的查询“select * from SP_TEST(1,2,3)”根本没有参数。
  • 使用TSQLQuery.SQL 属性而不是TSQLQuery.CommandText 属性。或切换到TSQLStoredProc
  • TSqlStoredProc 可以从 SP 中读取多行吗? @RemyLebeau

标签: sql delphi firebird dbexpress mismatch


【解决方案1】:

您的第三个参数是VARCHAR,但您尝试使用select * from SP_TEST(1,2,3),这里第三个参数是INTEGER。这也是与有效的过程调用的唯一区别。

所以改为使用:

select * from SP_TEST(1,2,'3')

(注意 3 周围的引号)

【讨论】:

  • 对不起,第一个参数列表是一个简单的示例,最后一个示例是我列出的 SP 的真实参数列表:SELECT * FROM SP_TEST(2014,1,'0001')
猜你喜欢
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多