2012-05-23 58 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(); 
相關問題