Q&A

  • DB에서 긴 스트링 읽기.(kylix)
윈도와 리눅스에서 동시에 작동하는 프로그램입니다.
DB에 아주 긴 스트링(100KB 이상)을 저장하고 불러오는 건데요.
윈도에서는 바르게 동작하는 데, 리눅스에선 문제가 생깁니다.
개발 환경은 windows : delphi 7,  linux : kylix 3 입니다.
DB는 서버 오라클 9i, 클라이언트 9i, DBexpr의 TSQLConnection, TSQLQuery 사용합니다.
문제가 되는 것은 long type column 입니다.

DB 연결부분입니다.
<!--CodeS-->
  SqlConn := TSQLConnection.Create(Nil);
  SqlConn.DriverName := 'Oracle';
  SqlConn.GetDriverFunc := 'getSQLDriverORACLE';
{$IFDEF MSWINDOWS}
  Sqlconn.LibraryName := 'dbexpora.dll';
  Sqlconn.VendorLib := 'oci.dll';
  SqlConn.Params.Add('Database=ORCA');
{$ELSE}
  Sqlconn.LibraryName := './libsqlora.so';
  Sqlconn.VendorLib := './libclntsh.so';
  SqlConn.Params.Add('Database=ORCA');
{$ENDIF}
  SqlConn.Params.Add('DriverName=Oracle');
  SqlConn.Params.Add('HostName=DbServer');
  SqlConn.Params.Add('User_Name=user');
  SqlConn.Params.Add('Password=pass');
  SqlConn.Params.Add('BlobSize=-1');                        //-------------- (1)
  SqlConn.Params.Add('RowSetSize=50');
  SqlConn.Params.Add('ErrorResourceFile=./ErrOracle.msg');
  SqlConn.LoginPrompt := false;

  SqlConn.Connected := true;
  Qry1 := TSQLQuery.Create(Nil);
  Qry1.SQLConnection := SqlConn;

문제의 부분입니다.

  Qry1.SQL.Clear;
  Qry1.SQL.Add('select ID, Dna from maza2 where inuse = '  // DNA가 long type
               + IntToStr(CID));
  Qry1.Prepared := true;
  Qry1.Open;
  while not Qry1.Eof do begin
    ID := Qry1['ID'];
//    TempStr := Qry1['Dna'];        //----------- (2) windows에서는 된다.
    SS := TStringStream.Create(s);
    try
      TBlobField(Qry1.FieldByName('Dna')).SaveToStream(SS);
      SS.Seek(0, soFromBeginning);
      TempStr := SS.ReadString(high(integer));
    finally
      SS.Free;
    end;
    write(id,'-',length(TempStr), ':');   //--- (3) 여기서 값을 확인.
//........후략
<!--CodeE-->

윈도에서 할 때는 (2)와 같이 했는데 잘 되더군요. 그래서 스트림은 사용하지 않았습니다.
리눅스에서 컴파일 후 실행하니 65536으로만 나옵니다. 스트림으로 바꾸어서 해 봤는데
결과는 마찬가지입니다. 여기서 SS는 TStringStream, s는 dummy용 string입니다.

고수님들의  도움 부탁드립니다.
1  COMMENTS
  • Profile
    류해곤 2005.04.16 02:07

    현재까지의 추적 결과로는 libsqlora.so 파일에 버그가 있는 듯합니다.
    getblobsize인가하는 함수가 65536을 반환하는것은 확인이 되었습니다.
    의외로 카일릭스 프로그램하기가 만만치 않네요. :(

    redhat linux 7.3 kernel 2.4.21 patch,
    libsqlora.so는 2002년 7월 31일자 313880 Byte 입니다.
    이후의 버전이나 버그 패치에 대한 정보나
    버그를 회피할 수 있는 방법의 추천을 바랍니다.

    볼랜드 페이지는 사용이 너무 어려워서... T.T