C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[19948] Re:[질문]DBGrid의 내용을 CSV File로 저장시 속도문제 및 File분할문제.
김백일 [cedar] 2134 읽음    2002-07-09 13:37
김재영 님이 쓰신 글 :
: C++ Builder 초보입니다.
: 현재 개발하고 있는 애플리케이션내에서 화면으로 조회하는 모든 데이타는 CSV File로 저장할
: 수 있습니다.
:
: 그런데...데이타 건수가 많아지면 Performance에 문제가 생기며,
: 또하나 새로운 문제는 엑셀에서는 데이타가 4-5만건(?)이상일 때는 불러들일 수 없는 줄로 알고
: 있습니다.
:
: 현재 데이타가 만건이 넘으면 Application이 응답이 없는 중대한 문제가 있구요.

이렇게 오랜 시간이 걸리는 작업의 경우는,
스레드(TThread)를 만들어서 스레드에서 작업을 돌리시면
애플리케이션이 이벤트에 응답할 수 있습니다.
ProgressBar 등으로 진행 상황을 표시하는 코드를 넣어도 좋겠죠.
빌더에서 스레드를 사용하는 방법은 무지 쉽습니다.
자바에서 스레드를 쓰는 방법과 비슷하지요.
자세한 내용은 빌더 책에서 스레드 부분을 참고하세요.

: 고수님들의 노하우를 듣고 싶습니다.
: 첫째, 데이타를 쪼개어서 각기 연속된 파일로 저장하는 방법과
: 둘째, DBGrid의 각 셀마다 구분자','를 주게되는데, 이로인해 발생되는 Performance문제...를
:       해결할 수 있는가...

참고로, DB가 Interbase라면
둘째 경우는 쉬우면서도 상당히 빠르게 구현하는 방법이 있습니다.
(개인적으로 인터베이스 밖에는 다른 DBMS를 모릅니다. -_-a)

TIBSQL, TIBDataSet, TIBQuery의 BatchOut 메소드와 TIBOutputDelimitedFile 클래스를 사용하는 방법입니다.

빌더에서는 다음과 같이 코딩하면 됩니다.

void __fastcall TForm1::Button1Click(TObject* Sender)
{
  IBSQL1->Database->Open(); // DB가 이미 오픈되어 있다면 필요없습니다.
  IBSQL1->Transaction->StartTransaction();
  IBSQL1->SQL->Text = "Select name, number, hired from Source";
  TIBOutputDelimitedFile *DelimOutput = new TIBOutputDelimitedFile;
  try {
    DelimOutput->Filename = "source_delim.csv";
    DelimOutput->ColDelimiter = ",";
    IBSQL1->BatchOutput(DelimOutput);
  } __finally {
    delete DelimOutput;
    IBSQL1->Transaction->Commit(); // 커밋 후에 DB 연결을 유지해야 한다면, Commit대신 CommitRetaining()을 쓰세요.
  }
}

상당히 간단하지요?

참고로 델파이 코드도 소개합니다.

procedure TForm1.Button1Click(Sender: TObject);
var
  DelimOutput : TIBOutputDelimitedFile;
begin
  IBSQL1.Database.Open;
  IBSQL1.Transaction.StartTransaction;
  IBSQL1.SQL.Text := 'Select name, number, hired from Source';
  DelimOutput := TIBOutputDelimitedFile.Create;
  with DelimOutput
    try
      Filename := 'source_delim.csv';
      ColDelimiter := ',';
      IBSQL1.BatchOutput(DelimOutput);
    finally
      Free;
      IBSQL1.Transaction.Commit;
    end;
  end;
end;

+ -

관련 글 리스트
19939 [질문]DBGrid의 내용을 CSV File로 저장시 속도문제 및 File분할문제. 김재영 1573 2002/07/09
19948     Re:[질문]DBGrid의 내용을 CSV File로 저장시 속도문제 및 File분할문제. 김백일 2134 2002/07/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.