2013-02-03 2 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 PARAM은 다음 코드에 의해 설정됩니다 :

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

:artist param이 현재 항목의 값을 cbArtist으로 저장하도록했습니다. 그러나 응용 프로그램을 컴파일 할 때 cbDiscography은 채워지지 않습니다.

이 기능을 사용하려면 어떻게해야합니까?

+0

쿼리를 실행하면 아무 것도 반환하지 않습니다. 그 결과를 다른 콤보에 어디에 묶었습니까? –

+0

"Girls 'Generation"과 같은 정적 값을 사용하면 쿼리가 작동하지만': artist'매개 변수를 사용하면 아무 것도 반환하지 않습니다. 바인딩의 이미지는 다음과 같습니다. http://i7.minus.com/ibs9ExlC3sKPld.png – ple103

+0

델파이 2005에서 여전히 잃어 버렸기 때문에 XE를 검사 할 필요가 없습니다. 정적을 사용한다고하면 qDisco.ParamByName ('아티스트')을 의미합니다. 값 : = '정적'. 매개 변수의 유형이 잘못되었는지 궁금합니다. –

답변

2

쿼리를 열 때 매개 변수의 값이 데이터베이스 엔진으로 전달됩니다. 활성 조회 오브젝트에 대한 매개 변수 값 변경은 데이터 세트를 닫았다가 다시 열 때까지 적용되지 않습니다.

미 추측은 당신이 마지막 단계를 수행하지 않는, 그래서 당신의 이벤트 처리기 방법을 변경 : 당신이 볼 수 있듯이

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

, 이것은 모든 음반의 레코드를 검색 할 수있는 전체 데이터베이스 왕복을 포함한다 현재 아티스트와 관련된