我试图使用参数化查询与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);
我究竟做错了什么?
据我所知ADO不支持命名的SQL语句(SELECT,INSERT,UPDATE)参数,所以你必须使用?
烧焦指示参数
sql := 'INSERT INTO Sqm(Filename, data) VALUES(?, ?)';
然后以相同的顺序在SQL语句中使用分配参数值。
ADO 2.6引入了NamedParameters
属性,但它似乎只用于存储过程。
试试这个
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没有问题。
如下图所示使用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();