Q&A

  • ClientDataSet과 ADOQUERY로 Oracle에 Image 파일을 넣는데 문제가
안녕하세요..

질문 하나 하려구요..

ClientDataSet고 AdoQuery를 이용해서 Oracle에 Image 파일을 넣으려고 하는데

문제가 있어서요..

많은 고수님들께 조언을 얻고자 이렇게 질문을 드립니다.

지금 구성은..

Oracle 8.0.5를 DB로 쓰고 있구요..

한 테이블에 LONG RAW type의 필드(예 : STAMP_IMAGE )를 잡았습니다.



서버는 window2000에 Transactional Data Module상에

TADOConnection - TADOQuery - TDATASETPROVIDER로 설정해서

COM+에 등록해 놓았구요.

Query에 SELECT STAMP_IMAGE FROM 테이블.

이렇게 해 놓았죠..



클라이언트에는

SocktConnect - ClientDataSet(CDSSOI001) - DataSource로 해서

서버에 연결했습니다.



그리고 클라이언트에서 bmp파일을 읽어서 DB에 저장하려고 하는데

if OpenPictureDialog1.Execute then

begin

if NOT ( CDSSOI001.State IN [dsInsert,dsEdit]) then

CDSSOI001.Edit;

DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);



// TBlobField(CDSSOI001.FieldByName('STAMP_IMAGE')).Assign

//(DBImage1.Picture.Bitmap);

TBlobField(CDSSOI001.FieldByName('STAMP_IMAGE')).LoadFromFile(OpenPictureDialog1.FileName);

end;



이렇게 하고서 post 시킨 후 ApplyUpdate를 했더니

CDSSOI001.Post;

CDSSOI001.ApplyUpdates(0);



다음과 같은 메시지가 뜨면서 이미지 파일이 저장이 안되네요..

'ORA-01461: LONG 값은 LONG 열에만 입력할 수 있습니다'

modified value나 original value나 다 binary로 되있는데

저장이 안되네요..



그래서 서버쪽을 무시하고

그냥 클라이언트 쪽에서 ADOConnection과 AdoQuery를 사용해서

테스트 해보니 이번엔 저장이 되구요..

if OpenPictureDialog1.Execute then

begin

if NOT ( ADOQuery1.State IN [dsInsert, dsEdit ]) then

ADOQuery1.Edit;



TBlobField(ADOQuery1IMAGE).LoadFromFile(OpenPictureDialog1.FileName);

end;



어떻게 해야 할지 상당히 난감합니다.

여기 계시판에 있는 글들은 다 읽어봤는데 저와 같은 경우는 없는 것 같더군요.

답변 남겨주시면 감사하
2  COMMENTS
  • Profile
    2001.10.10 00:19
    이미지는 blob형인데, long형에 넣어서 그런건 아닌지...

    밑 글에서 서버쪽을 무시했다는 것이 무슨 의미인지 모르겠습니당...





    미토 wrote:

    > 안녕하세요..

    > 질문 하나 하려구요..

    > ClientDataSet고 AdoQuery를 이용해서 Oracle에 Image 파일을 넣으려고 하는데

    > 문제가 있어서요..

    > 많은 고수님들께 조언을 얻고자 이렇게 질문을 드립니다.

    > 지금 구성은..

    > Oracle 8.0.5를 DB로 쓰고 있구요..

    > 한 테이블에 LONG RAW type의 필드(예 : STAMP_IMAGE )를 잡았습니다.

    >

    > 서버는 window2000에 Transactional Data Module상에

    > TADOConnection - TADOQuery - TDATASETPROVIDER로 설정해서

    > COM+에 등록해 놓았구요.

    > Query에 SELECT STAMP_IMAGE FROM 테이블.

    > 이렇게 해 놓았죠..

    >

    > 클라이언트에는

    > SocktConnect - ClientDataSet(CDSSOI001) - DataSource로 해서

    > 서버에 연결했습니다.

    >

    > 그리고 클라이언트에서 bmp파일을 읽어서 DB에 저장하려고 하는데

    > if OpenPictureDialog1.Execute then

    > begin

    > if NOT ( CDSSOI001.State IN [dsInsert,dsEdit]) then

    > CDSSOI001.Edit;

    > DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);

    >

    > // TBlobField(CDSSOI001.FieldByName('STAMP_IMAGE')).Assign

    > //(DBImage1.Picture.Bitmap);

    > TBlobField(CDSSOI001.FieldByName('STAMP_IMAGE')).LoadFromFile(OpenPictureDialog1.FileName);

    > end;

    >

    > 이렇게 하고서 post 시킨 후 ApplyUpdate를 했더니

    > CDSSOI001.Post;

    > CDSSOI001.ApplyUpdates(0);

    >

    > 다음과 같은 메시지가 뜨면서 이미지 파일이 저장이 안되네요..

    > 'ORA-01461: LONG 값은 LONG 열에만 입력할 수 있습니다'

    > modified value나 original value나 다 binary로 되있는데

    > 저장이 안되네요..

    >

    > 그래서 서버쪽을 무시하고

    > 그냥 클라이언트 쪽에서 ADOConnection과 AdoQuery를 사용해서

    > 테스트 해보니 이번엔 저장이 되구요..

    > if OpenPictureDialog1.Execute then

    > begin

    > if NOT ( ADOQuery1.State IN [dsInsert, dsEdit ]) then

    > ADOQuery1.Edit;

    >

    > TBlobField(ADOQuery1IMAGE).LoadFromFile(OpenPictureDialog1.FileName);

    > end;

    >

    > 어떻게 해야 할지 상당히 난감합니다.

    > 여기 계시판에 있는 글들은 다 읽어봤는데 저와 같은 경우는 없는 것 같더군요.

    > 답변 남겨주시면 감사하
  • Profile
    미토 2001.10.10 20:37
    'ORA-01461: LONG 값은 LONG 열에만 입력할 수 있습니다'

    라는 에러 메세지는 LONG 형을 LONG TYPE이 아닌 필드에 집어넣으려고

    하기 때문에 난다고 하거든요..

    그런데 테이블의 STAMP_IMAGE는 LONG RAW TYPE이구요..

    서버쪽을 무시한다는 것은 지금 3-tier로 테스트하고 있는데

    그냥 서버쪽으로 connect 하지 않고 client에서 바로

    ADOQUERY를 올려놓고 테스트 한다는 것이었읍니다.

    아마 ClientDataSet에서 문제가 있는 것 같은 데 어느 부분인지

    감을 못 잡겠습니다.

    답변 부탁드립니다.





    감 wrote:

    > 이미지는 blob형인데, long형에 넣어서 그런건 아닌지...

    > 밑 글에서 서버쪽을 무시했다는 것이 무슨 의미인지 모르겠습니당...

    >

    >

    > 미토 wrote:

    > > 안녕하세요..

    > > 질문 하나 하려구요..

    > > ClientDataSet고 AdoQuery를 이용해서 Oracle에 Image 파일을 넣으려고 하는데

    > > 문제가 있어서요..

    > > 많은 고수님들께 조언을 얻고자 이렇게 질문을 드립니다.

    > > 지금 구성은..

    > > Oracle 8.0.5를 DB로 쓰고 있구요..

    > > 한 테이블에 LONG RAW type의 필드(예 : STAMP_IMAGE )를 잡았습니다.

    > >

    > > 서버는 window2000에 Transactional Data Module상에

    > > TADOConnection - TADOQuery - TDATASETPROVIDER로 설정해서

    > > COM+에 등록해 놓았구요.

    > > Query에 SELECT STAMP_IMAGE FROM 테이블.

    > > 이렇게 해 놓았죠..

    > >

    > > 클라이언트에는

    > > SocktConnect - ClientDataSet(CDSSOI001) - DataSource로 해서

    > > 서버에 연결했습니다.

    > >

    > > 그리고 클라이언트에서 bmp파일을 읽어서 DB에 저장하려고 하는데

    > > if OpenPictureDialog1.Execute then

    > > begin

    > > if NOT ( CDSSOI001.State IN [dsInsert,dsEdit]) then

    > > CDSSOI001.Edit;

    > > DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);

    > >

    > > // TBlobField(CDSSOI001.FieldByName('STAMP_IMAGE')).Assign

    > > //(DBImage1.Picture.Bitmap);

    > > TBlobField(CDSSOI001.FieldByName('STAMP_IMAGE')).LoadFromFile(OpenPictureDialog1.FileName);

    > > end;

    > >

    > > 이렇게 하고서 post 시킨 후 ApplyUpdate를 했더니

    > > CDSSOI001.Post;

    > > CDSSOI001.ApplyUpdates(0);

    > >

    > > 다음과 같은 메시지가 뜨면서 이미지 파일이 저장이 안되네요..

    > > 'ORA-01461: LONG 값은 LONG 열에만 입력할 수 있습니다'

    > > modified value나 original value나 다 binary로 되있는데

    > > 저장이 안되네요..

    > >

    > > 그래서 서버쪽을 무시하고

    > > 그냥 클라이언트 쪽에서 ADOConnection과 AdoQuery를 사용해서

    > > 테스트 해보니 이번엔 저장이 되구요..

    > > if OpenPictureDialog1.Execute then

    > > begin

    > > if NOT ( ADOQuery1.State IN [dsInsert, dsEdit ]) then

    > > ADOQuery1.Edit;

    > >

    > > TBlobField(ADOQuery1IMAGE).LoadFromFile(OpenPictureDialog1.FileName);

    > > end;

    > >

    > > 어떻게 해야 할지 상당히 난감합니다.

    > > 여기 계시판에 있는 글들은 다 읽어봤는데 저와 같은 경우는 없는 것 같더군요.

    > > 답변 남겨주시면 감사하