我正在尝试使用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);
我做错了什么?
答案 0 :(得分:12)
据我所知,ADO不支持SQL语句中的命名参数(SELECT,INSERT,UPDATE),因此必须使用?
字符来表示参数
sql := 'INSERT INTO Sqm(Filename, data) VALUES(?, ?)';
然后按照sql语句中使用的顺序分配参数值。
ADO 2.6引入NamedParameters
属性,但似乎只适用于存储过程。
答案 1 :(得分: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,我一直在使用名称参数,没有问题。
答案 2 :(得分:0)
使用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();