사용하시는 델파이의 버전과 업데이트 상태를 확인해보세요.
MS SQL서버용 dbExpress 드라이버는 델파이7부터 지원되기 시작했는데, 제가 테스트한 것은 델파이7이며
업데이트 1이 적용된 상태입니다. 업데이트1도 한번 수정된 버전이 나왔는데 그 새 버전이구요.
확인하시려면 델파이의 bin 디렉토리의 dbexpmss.dll 파일의 등록정보를 보세요.
델파이7 버전인 경우 파일 버전 7.1.1523.17956, 날짜가 2004년 2월 28일입니다.
델파이2005 버전의 경우 파일 버전은 9.0.1882.30496, 날짜는 2005년 3월 5일입니다.
그럼...
임기섭 님이 쓰신 글 :
: 다시 질문드립니다.
: 쿼리분석기에서 프로스저를 생성하고 문장으로 쿼리를 만든후 테스트를 해보았습니다.
: 그런데 저는 왜 에라가 나는지 모르겠습니다.
:
: SQLStoredProc1프로퍼티에서는 이외에는 수정하지 않았습니다.
:
: SQLStoredProc1.SQLConnection :=P_a_DataF.ALL_Connection;
: SQLStoredProc1.StoredProcName:='sp_er_Test';
:
: with SQLStoredProc1 do begin
: ParamByName('memid').AsString:='20060221';
: ExecProc;
: Showmessage(ParamByName('outmemid').AsString);
: end;
: 위 소스를 실행해본 결과 SQLStoredProc1 parameter @memid not found 에러 입니다.
: 어찌 되느일인지요
: 분명히 쿼리문에 가서 보면 sp_er_Test프로시저는 존재합니다.
: 그리고 exec sp_er_Test '20060201',' ' 하면 정상입니다.
: 좀 부탁드리겠습니다.
: 다시한번 흔쾐한 답변 부탁합니다.
:
:
: 박지훈.임프 님이 쓰신 글 :
: : MS SQL서버에서 간단한 샘플을 만들어서 해봤습니다.
: :
: : 스토어드 프로시저는 다음과 같습니다.
: : CREATE proc ImpTest
: : @memid char(10),
: : @outmemid char(10) output
: : as
: : begin
: : set @outmemid =SUBSTRING(@memid, 1, 2)
: : end
: : GO
: :
: : 그리고 SQLStoredProc 컴포넌트를 실행하는 코드는 다음과 같습니다.
: : procedure TForm1.Button1Click(Sender: TObject);
: : begin
: : with SQLStoredProc1 do
: : begin
: : ParamByName('@memid').AsString:='20060221';
: : ExecProc;
: : Caption := ParamByName('@outmemid').AsString;
: : end;
: : end;
: :
: : 결론은, 잘 됩니다. ^^
: : 스토어드 프로시저의 이름을 넣은 직후에 Params에는 실제 필요한 파라미터들이 자동으로 채워집니다.
: : 따라서 CreateParam()를 호출하면 필요없는 파라미터가 추가로 더 생성되게 됩니다.
: : 결국 Index out of bounds 에러가 발생할 수밖에 없군요.
: :
: : 그럼...
: :
: :
: : 임기섭 님이 쓰신 글 :
: : : 답변감사합니다.
: : : 앞으로 답변을 여러종류의 답변을 하지 않는것으로 하겠습니다.
: : : 죄송합니니다.
: : :
: : : 1번째 답변은 params.creater는 삭제나 추가하나 에라 답변은 똑같습니다.
: : : list index out of bound에라입니다.
: : : 아마 그것 문장과는 상관이 없는것 같습니다.
: : : 참 주위의 지인들에게 답변을 얻은봐 델파이 dbexpress버그라 합니다. 다른 관련Db는 잘 되다 합니다. 또 상용버젼 DbExpress버젼은 아무 이상이 없답니다.
: : : 고맙습니다.,
: : :
: : :
: : : 박지훈.임프 님이 쓰신 글 :
: : : : 질문은 한번에 하나씩 해주시면 좋겠네요. 보통 답변을 쓰시는 분들은 남는 시간에 소일거리삼아 하는데...
: : : : 여러개가 엮여 있으면 일단 내용을 보기 전부터 모양새가 부담스러워서 그냥 넘어가기 쉽답니다. ^^
: : : :
: : : : 첫번째 질문은...
: : : : 다른 부분은 별 문제가 없는 거 같은데, Params.Create; 부분이 수상합니다.
: : : : Params는 TSQLQuery나 TSQLStoredProc 컴포넌트가 이미 기본적으로 생성시켜놓은 상태이므로 생성자를 여기서
: : : : 호출할 이유가 없겠고, 게다가 여기서 생성자를 호출하면 예상치못한 희한한 에러가 발생할 수 있습니다.
: : : :
: : : : 아마도 TSQLStoredProc에서 읽으려고 하는 Params 대신 허공을 떠도는 처녀귀신 Params 객체가 만들어지고 거기에
: : : : 파라미터가 생성될 겁니다. 그러니 TSQLStoredProc에는 파라미터가 하나도 안들어가있는 상태가 될 듯.
: : : : index out of bounds 예외가 발생한 것은 그 때문인 것 같습니다.
: : : : 그러니 해결책은, Params.Create; 라인만 지워버리면 될 듯.
: : : :
: : : : 두번째 질문은...
: : : : P_a_DataF.Q1이 아마도 TSQLQuery인가본데요. TSQLQuery와 같은 쿼리 전용 컴포넌트에서는 스토어드 프로시저를
: : : : 실행할 수는 있어도 출력 파라미터 값을 받아올 수는 없습니다. 그렇기 때문에 TSQLStoredProc 같은 스토어드 프로시저
: : : : 전용 컴포넌트가 필요한 거죠.
: : : :
: : : : 그럼...
: : : :
: : : :
: : : : 궁금이 님이 쓰신 글 :
: : : : : 델7입니다.
: : : : : 디비는 mssql
: : : : : 컴포넌트는 DbExPress입니다.
: : : : : AcceptDate와 AcceptGubun은 input변수이고
: : : : : AcceptSeq는 output데이터 입니다.
: : : : :
: : : : : 질문1
: : : : : 그런데 소스1를 보면 params.count보면 3이 제대로 나오는데 왜 list indexout of bounds인지요
: : : : :
: : : : : 질문2
: : : : : 그런데 소스2를 보면 Query를 이용하여 프로시저를 사용하는데 에라는 없는데 왜
: : : : : AcceptSeq의 변수에 값이 안넘어 올까요 궁금합니다.
: : : : : 쿼리분석기에서
: : : : : exec sp_er_acceptNo '20060222','E',''
: : : : : 실행하면 값을 가져옵니다 00008이런식으로
: : : : :
: : : : : 그럼 수고하세요
: : : : :
: : : : : 소소1
: : : : : With SQLStoredProc1 Do begin
: : : : : Close;
: : : : : StoredProcName:='sp_er_AcceptNo';
: : : : : Params.Create;
: : : : : params.CreateParam(FtString ,'AcceptDate' , ptInput ).AsString:='20060221';
: : : : : params.CreateParam(FtString ,'AcceptGubun', ptInput ).AsString:='E' ;
: : : : : params.CreateParam(FtString ,'AcceptSeq' , ptOutput).AsString:=Acc_Code;
: : : : : ExecProc; //여기에서 에라입니다. List index out of bounds에라입니다.
: : : : : End;
: : : : :
: : : : : 소소2
: : : : : With P_a_DataF.Q1 do begin
: : : : : Close;
: : : : : SQL.Clear;
: : : : : SQL.Add('Exec sp_er_AcceptNo :Date, :Gubun,:Seq ');
: : : : : ParamByName('Date' ).AsString:='20060221';
: : : : : ParamByName('Gubun').AsString:='E' ;
: : : : : ParamByName('Seq' ).AsString:='' ;
: : : : : Try
: : : : : ExecSQL;
: : : : : Except
: : : : : on E: EDBEngineError do begin
: : : : : ShowMessage(IntToStr((E as EDBEngineError).Errors[0].ErrorCode)+':'+E.Message);
: : : : : Exit;
: : : : : end;
: : : : : End;
: : : : : End;
|