2011-11-30 127 views
2

當試圖執行代碼:這裏是什麼「缺少SQL屬性」?

function TDBClass.addNome(nome: String): String; 
var 
    rsnome: TADOQuery; 
begin 
    rsnome := TADOQuery.Create(nil); 
    rsnome.Connection := connection; 
    rsnome.Open(); 
    rsnome.SQL.Clear; 
    rsnome.SQL.Text:='UPDATE enroll SET nome = "test" where id ="1"'; 
    rsnome.Parameters.ParamByName('nome').Value:= nome; 
    rsnome.ExecSQL; 
    rsnome.post(); 
    rsnome.Close(); 
    rsnome.Free(); 
end; 

我收到錯誤消息「缺少SQL屬性」。我哪裏做錯了?
在此先感謝!

回答

5

我不認爲你想使用Open,並且你使用的參數不正確。
即SQL中沒有任何:PARAM佔位符。我想應該是這樣的:rsnome.SQL.Text:='UPDATE enroll SET nome = :NOME where id = :ID';

見這個例子: AdoQuery Error using parameters

+0

並將其封裝在try/finally塊中,因爲您的查詢對象沒有所有者。 –

8

在將SQL設置爲rsnome.SQL.Text := ...之前,您正在調用rsnome.Open

+0

參數應與前面「:」爲:諾姆。您不需要ExecSql後的post(),您可能需要爲要分配的參數值準備查詢。 [rsnome.PREPARED = True;]。 –

+1

@Pieter,你根本不需要設置[Prepared](http://docwiki.embarcadero.com/VCL/XE2/en/ADODB.TADOQuery.Prepared)屬性。它用於緩存參數值,如果您重複執行具有相同參數值的查詢,則不會發生這種情況。用問題查詢調用[打開](http://docwiki.embarcadero.com/VCL/en/DB.TDataSet.Open)將失敗,並顯示空數據集。肯的​​+1 [回答](http://stackoverflow.com/a/8327084/960757)。 – TLama

+0

非常感謝您的幫助,這非常有用。最好的祝福。 –

4

你有幾個錯誤。您在分配SQL之前調用Open(並且不需要這樣做)。

您正試圖設置一個參數值,但您尚未創建要接受的參數。 (順便說一句,我會讓ID也是一個參數,所以你可以用它來更新多個人的名字。)

你沒有處理確保事情得到清理,以防萬一有錯誤(給定你在那裏發佈的代碼肯定會是)。

您正在使用Post,這對於SQL數據庫不是必需的。

嘗試這樣的事情,而不是:

function TDBClass.addNome(nome: String): String; 
var 
    rsnome: TADOQuery; 
begin 
    rsnome := TADOQuery.Create(nil); 
    try 
    rsnome.Connection := connection; 
    rsnome.SQL.Clear; 
    rsnome.SQL.Text:='UPDATE enroll SET nome = :nome where id ="1"'; 
    rsnome.Parameters.ParamByName('nome').Value:= nome; 
    rsnome.ExecSQL; 
    rsnome.Close(); 
    finally 
    rsnome.Free(); 
    end; 
end; 
+0

非常感謝您的幫助! –