ADO 没有传递第一个参数值
ADO not passing first parameter value
我正在使用 ADO Command 对象生成针对 SQL 服务器的参数化查询。
如果我生成并提供多个参数,则传递所有参数值 - 除了第一个。
如果您想象这样的查询:
SELECT ?, ?, ?, ?, ?
并使用 ADO 命令对象提供参数值:
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查看第一个参数值为空:
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
我做错了什么?
- 客户端: Windows Vista,Windows 7,Windows 10
- OLEDB 提供商:SQLOLEDB,SQLNCLI11,MSOLEDBSQL
- 服务器: SQL 服务器 2000,SQL 服务器 2005,SQL 服务器 2008 R2,SQL 服务器 2012, SQL服务器 2017
- 编译器:Delphi 5,Delphi XE6,Delphi 10.3 Electric Boogaloo
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.
红利阅读
- ADO Command Parameter Not Passing to Stored Procedure or Stored Procedure 'Ignoring' Parameter
- ADODB not passing in parameters
您应该在 cmd.Execute
语句(即 Parameters
参数)中使用 EmptyParam
而不是 Null
。
cmd.Execute({out}recordsAffected, EmptyParam, adExecuteNoRecords);
参见:Execute Method (ADO Command)
EmptyParam
应该与可选的 ole 参数兼容。
您也可以在示例中使用 OleVariant(cmd).Execute
。
我正在使用 ADO Command 对象生成针对 SQL 服务器的参数化查询。
如果我生成并提供多个参数,则传递所有参数值 - 除了第一个。
如果您想象这样的查询:
SELECT ?, ?, ?, ?, ?
并使用 ADO 命令对象提供参数值:
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查看第一个参数值为空:
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
我做错了什么?
- 客户端: Windows Vista,Windows 7,Windows 10
- OLEDB 提供商:SQLOLEDB,SQLNCLI11,MSOLEDBSQL
- 服务器: SQL 服务器 2000,SQL 服务器 2005,SQL 服务器 2008 R2,SQL 服务器 2012, SQL服务器 2017
- 编译器:Delphi 5,Delphi XE6,Delphi 10.3 Electric Boogaloo
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.
红利阅读
- ADO Command Parameter Not Passing to Stored Procedure or Stored Procedure 'Ignoring' Parameter
- ADODB not passing in parameters
您应该在 cmd.Execute
语句(即 Parameters
参数)中使用 EmptyParam
而不是 Null
。
cmd.Execute({out}recordsAffected, EmptyParam, adExecuteNoRecords);
参见:Execute Method (ADO Command)
EmptyParam
应该与可选的 ole 参数兼容。
您也可以在示例中使用 OleVariant(cmd).Execute
。