{{{ DB에서 LOB 데이터 불러오기 ========================== //#include "jpeg.hpp" 해야함 //이미지를 TImage에 불러 오기 위한 처리부분 TJPEGImage *jpg = new TJPEGImage; try{ TBlobField *bf = dynamic_cast< TBlobField* >(photoQ->FieldByName("s_photo")); jpg->Assign(bf); s_photo_image->Picture->Graphic = jpg; } __finally{ delete jpg; } DB에 LOB데이터 저장하기 ======================== /*************** Main Data Module *********************************************************** insert into student(STUDENT_NUM, JUMIN_NUM, S_NAME, PASSWD, GUBUN, GRADE, SEX, EMAIL, HABITATION, PHONE_NUM, S_ADDR, RELIGION, R_PART, CHURCH, S_PHOTO) values (:STUDENT_NUM, :JUMIN_NUM, :S_NAME, :PASSWD, :GUBUN, :GRADE, :SEX, :EMAIL, :HABITATION, :PHONE_NUM, :S_ADDR, :RELIGION, :R_PART, :CHURCH, :S_PHOTO) *********************************************************************************************/ String jumin = jumin_Edit1->Text + jumin_Edit2->Text; String param[] = {snum_Edit->Text, jumin, sname_Edit->Text, pw_Edit1->Text, gubun_Combo->Text, grade_Combo->Text, sex_Combo->Text, email_Edit->Text, habi_Combo->Text, phone_Edit->Text, addr_Edit->Text, religion_Combo->Text, rpart_Edit->Text, church_Edit->Text}; //사용자 입력 정보 유효성 검사 check(); if(ck == 1){ //커서의 변경 TCursor OldCursor = Screen->Cursor; Screen->Cursor = crSQLWait; //파라미터 전달 for(int i=0; i<=13; i++) if(i == 5) MainDM->StudentRegQ->Parameters->Items[i]->Value = StrToInt(param[i]); else MainDM->StudentRegQ->Parameters->Items[i]->Value = param[i]; if(photo_Edit->Text.IsEmpty()) MainDM->StudentRegQ->Parameters->Items[14]->Value = param[14]; else //LoadFromFile을 이용해서 데이터베이스에 직접 때려 넣는다. //ADOQuery컴포넌트속에 미리 INSERT문과 호스트변수에 대한 선언을 해 놓았다. //사실 바이너리형 데이터를 다룰때는 프로시저를 이용하는 것을 적극 권장 //이유는 INSERT문으로 데이터를 삽입하게 되면 바이너리를 문자열로 바꿔서 전송하고 //문자열로 바꾼것을 서버에서 다시 바이너리형으로 바꾸어야하는 일을 해야함 //이러한 오버헤드와 문자열이 바이너리보다 2배정도 더 큰 용량을 가지기 때문에 //저장프로시저를 이용하면 네트웍트래픽과 CPU등의 시스템 자원을 덜 소모 MainDM->StudentRegQ->Parameters->Items[14]->LoadFromFile(photo_Edit->Text,ftBlob); MainDM->StudentRegQ->ExecSQL(); MainDM->StudentRegQ->Close(); //커서를 원래 스크린의 커서로 변경 Screen->Cursor = OldCursor; ShowMessage("사용자 등록이 성공적으로 이루어 졌습니다."); Close(); } DB에서 바이너리데이터 다운로드 ============================== //donwQ --> ADOQuery Component downQ->Close(); downQ->SQL->Clear(); int id = dataDownQ->Fields->Fields[0]->AsInteger; downQ->SQL->Add("select lecture_data from lecture_data "); downQ->SQL->Add("where id =" + IntToStr(id) ); //dataDownQ는 그리드 컴포넌트와 연결되어 있음.. // 7번째 필드에 파일명을 같이 삽입하였음... SaveDialog->FileName = dataDownQ->Fields->Fields[7]->AsString; if(SaveDialog->Execute()){ if( FileExists(SaveDialog->FileName) ){ if( Application->MessageBox("이전 파일에 덮어 쓰시겠습니까?", "파일 저장", MB_YESNO ) == IDNO ) return; } AnsiString fname = SaveDialog->FileName; //커서의 변경. TCursor OldCursor = Screen->Cursor; Screen->Cursor = crSQLWait; downQ->Open(); //커서를 원래대로 변경 Screen->Cursor = OldCursor; //데이터를 다운로드 하는 코드 //반드시 스트림으로 받아야함 TStream *st; TFileStream *fs = new TFileStream(fname, fmCreate); try{ st = downQ->CreateBlobStream((downQ->FieldByName("lecture_data")), bmRead); fs->CopyFrom(st, st->Size); } __finally{ delete fs; } delete st; } }}} ---- 불러오기 창이 없음..... -- 김성현 2012-11-25 10:46:57