|
제가 강의를 할 때 TSQLClientDataSet에 대해, SQLDataSet-Provider-ClientDataSet을 조합한 것으로 편의용
컴포넌트라고 말씀드렸었죠. 사실이긴 합니다만, 방금 TSQLClientDataSet의 소스를 보니 좀 문제가 있는 것
같습니다.
결과만 말씀드리면, TSQLClientDataSet에서 CommandText를 설정할 때 Params가 같이 설정되는 것은 디자인타임
에서만 가능하도록 되어있더군요. 그렇다고 이게 VCL의 코드상의 버그인 것은 아닌 것 같고, TSQLClientDataSet의
설계상의 버그인 것 같습니다. 이것은 앞에서 말씀드렸다시피 세가지 컴포넌트를 하나로 뭉뚱그려놓은 것인데,
그러다보니 설계상으로 꼬인 듯 합니다. (내부적으로 수퍼클래스인 TClientDataSet의 Params는 원래 프로바이더를
위한 파라미터인데 TSQLClientDataSet으로 상속되면서 쿼리를 위한 파라미터로 쓰이게 되어 꼬인 듯...)
그래서, 디자인타임이 아닌 코드상에서 런타임에 파라미터를 설정하기 위해서는 TSQLClientDataSet을 쓰는
것은 문제가 있을 것 같습니다. 이런 필요가 있다면 원칙대로 SQLDataSet-Provider-ClientDataSet의 조합을
쓰는 수밖에 없을 것 같구요.
참고로, VCL의 다음 버전이 탑재되어 있는 델파이 7에서는 TSQLClientDataSet을 없애고 역할은 비슷하지만
구조가 다른 TSimpleDataSet이라는 새로운 컴포넌트가 포함되어 있습니다. 이 TSimpleDataSet에서는 상속받은
Params와는 별도로, TSQLDataSet 객체인 DataSet 속성이 있고 그 멤버인 Params를 사용할 수 있게 되어있습니다.
다시 말해, TSimpleDataSet.Params와 TSimpleDataSet.DataSet.Params이 별도로 있고, 그 역할도 다르다는
얘기죠.
그럼...
seiyes 님이 쓰신 글 :
: 안녕하세요?
: c++builder 6.0을 쓰고 있는 초보입니다....
:
: grid를 이용하여 SQLClientDataSet과 연동하려고 하는데....다음과 같이 했습니다..
:
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: AnsiString empNo = Edit1->Text;
: SQLClientDataSet1->Close();
: SQLClientDataSet1->CommandText = "select * from emp where empno = :empNo ";
: -> SQLClientDataSet1->Params->ParamByName("empNo")->AsString = empNo;
: SQLClientDataSet1->Open();
: }
:
: 근데...에러를 뱉어내내요....
: 그런 파라메터가 없다고 합니다...
: -> 이 부분이 문제인거 같은데.....해결을 어케해야하나요..ㅜ.ㅜ
:
: 고수분들의 좋은 조언 부탁드립니다....^^
|