“必须声明变量@myvariable”与ADO参数化查询错误(“Must declare the v

2019-06-24 17:11发布

我试图使用参数化查询与ADO。 执行Command对象引发错误:

必须声明变量“@filename”

我声明参数@filename使用CreateParameter/Append

sql := 'INSERT INTO Sqm(Filename, data) VALUES(@filename, @data)';

command := CoCommand.Create;
command.Set_ActiveConnection(Connection.ConnectionObject);
command.Set_CommandText(sql);
command.Set_CommandType(adCmdText);
command.Parameters.Append(Command.CreateParameter('@filename', adLongVarWChar, adParamInput, -1, Filename));
command.Parameters.Append(Command.CreateParameter('@data', adLongVarWChar, adParamInput, -1, xml);

command.Execute({out}recordsAffected, EmptyParam, adCmdText or adExecuteNoRecords);

我究竟做错了什么?

Answer 1:

据我所知ADO不支持命名的SQL语句(SELECT,INSERT,UPDATE)参数,所以你必须使用? 烧焦指示参数

sql := 'INSERT INTO Sqm(Filename, data) VALUES(?, ?)';

然后以相同的顺序在SQL语句中使用分配参数值。

ADO 2.6引入了NamedParameters属性,但它似乎只用于存储过程。



Answer 2:

试试这个

uses ADODB, DB;
...
...
... and then in some event handler (e.g. button click),
var 
  aCommand :TADOCommand;
begin
  aCommand := TADOCommand.create(self);
  aCommand.ConnectionString := 'build the connection string or use TADOConnection and assign to Connection property instead of ConnectionString property';
  aCommand.commandText := 'INSERT INTO Sqm(Filename, data) VALUES(:filename, :data);';
  aCommand.parameters.paramByName('filename').value := 'test';
  aCommand.parameters.paramByName('data').value := 'some data';
  aCommand.execute;
  aCommand.free;
end;

我一直在使用参数的名称这种方式TADOCommand和TADOQuery没有问题。



Answer 3:

如下图所示使用Parameters.AddWithValue

  connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Jet OLEDB:Database Password=RainbowTrout;";
  InsertQry = "Insert into Sections(Name, PartNumber, VersionNumber, Channel, Address, Status, IPAddr) "
        + "values(@SectionName, @PartNumber, @VersionNumber, @Channel, @Address, @Status, @IPAddr)";


  NewCfgConnection.ConnectionString = string.Format(connectionString, ConfigFN);
  NewCfgCommand.Connection = NewCfgConnection;
  NewCfgCommand.CommandText = InsertQry;
  NewCfgConnection.Open();

  // Clear parameter values from last record
  NewCfgCommand.Parameters.Clear();

  // Insert record into sections table - set parameters
  NewCfgCommand.Parameters.AddWithValue("@SectionName", sSectionName);
  NewCfgCommand.Parameters.AddWithValue("@PartNumber", sPartNumber);
  NewCfgCommand.Parameters.AddWithValue("@VersionNumber", sVersionNumber);
  NewCfgCommand.Parameters.AddWithValue("@Channel", iChannel);
  NewCfgCommand.Parameters.AddWithValue("@Address", iAddress);
  NewCfgCommand.Parameters.AddWithValue("@Status", iStatus);
  NewCfgCommand.Parameters.AddWithValue("@IPAddr", iIP);

  NewCfgCommand.ExecuteNonQuery();


文章来源: “Must declare the variable @myvariable” error with ADO parameterized query