2012-05-23 60 views
4

我正在尝试使用带有ADO的参数化查询。执行Command对象抛出错误:“必须声明变量@myvariable”错误与ADO参数化查询

Must declare the variable '@filename'

我宣布使用CreateParameter/Append参数@filename

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

试着用':',而不是'@'在查询中PARAMS之前。并从添加参数的位置删除@。 –

+1

@MikaelEriksson:*第一行:'''附近语法不正确*您会感到惊讶,我当然是,没有人发布过ADO参数化查询的例子。 (可以在ADO.NET中找到很多) –

+0

看起来您直接使用ado接口而不是tadocommand。在查询中使用'?'尝试放置变量名'values(?,?)'。我离计算机有几个小时的路程,所以我无法验证它会工作。 –

回答

12

据我所知ADO不支持命名的SQL语句(SELECT,INSERT,UPDATE)参数,所以你必须使用?焦指示参数

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

,然后分配参数值与sql语句中使用的顺序相同。

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

+2

那么这当然可以解释为什么命名参数在ADO中不起作用。 * oi vay Microsoft * –

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没有问题。

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(); 
相关问题