首页 > 解决方案 > ADO 不传递第一个参数值

问题描述

我正在使用 ADO Command对象生成针对 SQL Server 的参数化查询。

如果我生成并提供多个参数,则所有参数值都会传递 -除了第一个参数值。

如果您想象这样的查询:

SELECT ?, ?, ?, ?, ?

并使用 ADO Command 对象提供参数值:

command.Parameters.Append(command.CreateParameter('', adInteger, adParamInput, 0, 1);
command.Parameters.Append(command.CreateParameter('', adInteger, adParamInput, 0, 2);
command.Parameters.Append(command.CreateParameter('', adInteger, adParamInput, 0, 3);
command.Parameters.Append(command.CreateParameter('', adInteger, adParamInput, 0, 4);
command.Parameters.Append(command.CreateParameter('', adInteger, adParamInput, 0, 5);

可以使用 Profiler 查看第一个参数值为 null:

在此处输入图像描述

exec sp_executesql N'SELECT @P1, @P2, @P3, @P4, @P5',N'@P1 int,@P2 int,@P3 int,@P4 int,@P5 int',NULL,2,3,4,5

我用不同的类型、不同的查询、不同的顺序尝试过它。它始终是拒绝提供给数据库服务器的第一个参数。

我可以在调用 Execute 之前确认该参数确实有一个值:

command.Parameters[0].Value

我究竟做错了什么?

CMRE

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  ActiveX,
  ComObj,
  ADOint,
  Variants;

procedure Main;
var
    cs: string;
    cn: Connection;
    cmd: Command;
    p: _Parameter;
    recordsAffected: OleVariant;
begin
    cs := 'Provider=SQLOLEDB;Data Source=screwdriver;User ID=frog;Password=hunter2';
    cn := CoConnection.Create;
    WriteLn('Connecting to database...');
    cn.Open(cs, '', '', Integer(adConnectUnspecified));

    cmd := CoCommand.Create;
    cmd.CommandType := adCmdText;
    cmd.CommandText := 'IF ? IS NULL RAISERROR(''It was null'', 16, 1);';

    cmd.Parameters.Append(cmd.CreateParameter('', adinteger, adParamInput, 0, 1));

    cmd.Set_ActiveConnection(cn);

    WriteLn('Executing command');
    cmd.Execute({out}recordsAffected, Null, adExecuteNoRecords);
end;

begin
  try
    CoInitialize(nil);
     Main;
        WriteLn('Success');
  except
     on E: Exception do
        begin
            Writeln(E.ClassName, ': ', E.Message);
        end;
  end;
    WriteLn('Press enter to close...');
    ReadLn;

end.

奖金阅读

标签: sql-serverdelphioledbado

解决方案


你应该在你的陈述中使用EmptyParam而不是(这是论点)。 Nullcmd.ExecuteParameters

cmd.Execute({out}recordsAffected, EmptyParam, adExecuteNoRecords);

请参阅:执行方法(ADO 命令)

EmptyParam应该与可选的 ole 参数兼容。您也可以OleVariant(cmd).Execute在您的示例中使用。


推荐阅读