【问题标题】:Parameter of stored procedure not found未找到存储过程的参数
【发布时间】:2015-08-09 10:49:49
【问题描述】:

我使用以下代码使用TADOStoredProc 类型调用我的存储过程

MySP.Connection := aConnection;
MySP.ProcedureName := 'dbo.UpdateErrors';
MySP.Parameters.ParamByName('@Error_Number').value := -1;
MySP.Parameters.ParamByName('@NewError_Name').value := 'errorM1';
MySP.Parameters.Refresh;

MySP.ExecProc;

参数@Error_Number是使用SQL Server Management Studio的存储过程UpdateErrors的一部分,我添加snip image进行确认

但我不明白为什么会出错

【问题讨论】:

  • 在设置参数之前尝试调用MySP.Parameters.Refresh。或者在您的TADOStoredProc 中创建这些参数而不调用Refresh。例如MySP.Parameters.CreateParameter('@Error_Number'...)(或在设计模式下创建)
  • 我不确定他们名字中的@
  • @TLama -- @ 应该在参数名称之前。测试。真的。
  • 您可以使用 Sql Profiler 准确查看您发送的命令吗?它可能会给你一些线索。代码中的第二个参数“@NewError_Name”也存在名称不匹配,而在 db 中它是“@New_Name”
  • @user1769184, "I changed from used names in the real application to a public Version with modified names" 在这种情况下请edit 你的代码。

标签: sql-server delphi stored-procedures ado


【解决方案1】:

只需使用 TADOCommand

  MyCommand.Connection := aConnection;
  MyCommand.CommandText := 'EXEC dbo.UpdateErrors :Er, :Na'; //you can call the params what you want
  MyCommand.Parameters[0].value := -1; //Or you can do ParamByNname and use Er and Na (or whatever you called your params) instead of indices
  MyCommand.Parameters[1].value := 'errorM1';
  MyCommand.Execute;

如果你想修复你的代码

 ErParam := MySP.Parameter.Add;
 ErParam.Name := '@Error_Number';
 ErParam.DataType := ftInteger; //put your correct type here
 ErParam.Direction := pdInput; //set your direction for the param

等等。更多工作......使用 ADOCommands 做第一种方法

【讨论】:

  • ErParam 的类型是什么? ErParam : TCollection 对我不起作用。
  • ErParam 的类型为 TParameter,如果您选择沿着声明参数的路径前进。
  • @kobik 不知道为什么您觉得需要编辑和添加 EXEC,如果命令中有单个 sp,则不需要它。
  • @jasper 如果您确定,您可以回滚我的编辑。确保你测试它。没有 EXEC 和参数之间的分隔符对我不起作用
  • @kobik。谢谢,你的编辑很好。只是想要更清晰的动机。 EXEC 更加谨慎,在这种情况下可能需要执行,因为指定了架构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2021-04-03
  • 2016-04-03
  • 1970-01-01
相关资源
最近更新 更多