“Must declare the variable @myvariable” error with ADO parameterized query

亡梦爱人 提交于 2019-11-28 01:29:29

问题


i am trying to use parameterized queries with ADO. Executing the Command object throws the error:

Must declare the variable '@filename'

i declare the parameter @filename using 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);

What am i doing wrong?


回答1:


As far i know ADO doesn't supports named parameters in SQL sentences (SELECT, INSERT, UPDATE), so you must use the ? char to indicate the parameter

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

and then assign the parameters values in the same order as are used in the sql sentence.

ADO 2.6 Introduces the NamedParameters property, but it seems which only works with stored procedures.




回答2:


try this

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;

I have been using parameter by names this way for TADOCommand and TADOQuery with no problem.




回答3:


Use Parameters.AddWithValue as shown below

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


来源:https://stackoverflow.com/questions/10725222/must-declare-the-variable-myvariable-error-with-ado-parameterized-query

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!