2013-02-03 60 views
1

我的意圖:這是使用SQL參數的正確方法嗎?

當用戶選擇了藝術家,唱片組合框將填補與特定藝術家有唱片分類目錄。


的代碼:

qDisco(TSQLQuery)是結合至cbDisco(TComboBox)數據和包含以下SQL:

SELECT DISTINCT discography 
FROM Album 
INNER JOIN Artist 
ON Album.artist_id = Artist.id 
WHERE Artist.name = :artist; 

:artist參數是由下面的代碼設定:

procedure Tmain.cbArtistChange(Sender: TObject); 
begin 
    qDisco.ParamByName('artist').Value := cbArtist.Items[cbArtist.ItemIndex]; 
end; 

我已確保:artist參數存儲cbArtist當前項目的值,但是當我編譯該應用程序時,cbDiscography仍未填充。

我能做些什麼來使其工作?

+0

執行查詢後是否返回任何內容。你在哪裏將結果綁定到其他組合? –

+0

如果我要使用靜態值(例如「少女時代」),查詢將起作用,但如果使用':artist'參數,則不會返回任何內容。這裏是綁定的圖像: http://i7.minus.com/ibs9ExlC3sKPld.png – ple103

+0

我迷失在這裏,仍然在Delphi 2005上,所以我沒有XE來檢查。當你說你使用靜態時,你的意思是qDisco.ParamByName('artist')。Value:='static'。想知道參數的類型是否錯誤。 –

回答

2

當您打開查詢時,任何參數的值都會傳遞到數據庫引擎。在關閉並重新打開數據集之前,更改活動查詢對象上的參數值不起作用。

米的猜想是你沒有做這最後一步,那麼改變你的事件處理方法:

procedure Tmain.cbArtistChange(Sender: TObject); 
begin 
    qDisco.ParamByName('artist').Value := cbArtist.Items[cbArtist.ItemIndex]; 
    qDisco.Close; 
    qDisco.Open; 
end; 

正如你所看到的,這涉及到一個完整的數據庫往返檢索所有唱片記錄與當前藝術家相關聯。

相關問題