Sql server ADO参数化查询“必须声明变量@myvariable”错误

Sql server ADO参数化查询“必须声明变量@myvariable”错误,sql-server,delphi,ado,parameterized-query,Sql Server,Delphi,Ado,Parameterized Query,我正在尝试将参数化查询与ADO结合使用。执行命令对象会引发错误: 必须声明变量“@filename” 我使用CreateParameter/Append声明参数@filename: 我做错了什么?据我所知,ADO不支持SQL语句中的命名参数SELECT、INSERT、UPDATE,所以必须使用?char来指示参数 sql := 'INSERT INTO Sqm(Filename, data) VALUES(?, ?)'; 然后按照sql语句中使用的顺序分配参数值 ADO 2.6引入了属性,但它

我正在尝试将参数化查询与ADO结合使用。执行命令对象会引发错误:

必须声明变量“@filename”

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


我做错了什么?

据我所知,ADO不支持SQL语句中的命名参数SELECT、INSERT、UPDATE,所以必须使用?char来指示参数

sql := 'INSERT INTO Sqm(Filename, data) VALUES(?, ?)';
然后按照sql语句中使用的顺序分配参数值

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

试试这个

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中使用parameter by names,没有问题。

使用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();

在查询中的参数之前尝试:而不是@。并从添加参数的位置删除@。@MikaelEriksson:Line 1:靠近“:”的语法不正确,我肯定会感到惊讶,因为从来没有人发布过ADO参数化查询的示例。在ADO.NET中可以找到很多东西。看起来您是直接使用ADO接口而不是tadocommand。试着用一个?在查询中,将变量名称值?。我离电脑还有几个小时的路程,所以我还不能确认它是否能工作。@MikaelEriksson你说得对。ADO不支持命名参数;这是我的第三个问题。这当然可以解释为什么命名参数在ADO中不起作用。爱维微软
  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();