2013-02-03 122 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; 

正如你所看到的,这涉及到一个完整的数据库往返检索所有唱片记录与当前艺术家相关联。

相关问题