Sql server ADO参数化查询“必须声明变量@myvariable”错误
我正在尝试将参数化查询与ADO结合使用。执行命令对象会引发错误: 必须声明变量“@filename” 我使用CreateParameter/Append声明参数@filename: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不支持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();