C ++ Builder를 사용하여 파일 이름의 액세스 데이터베이스를 작성하는 더 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/464108

문제

밤을위한 마지막 질문. 그리고 이것의 완전한 멍청이에 대해 사과합니다.

StackoverFlow와 Google의 도움으로 다음을 달성했습니다.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 ADOCommand1->CommandText = "drop table pictures purge";
 ADOCommand1->Execute();
 ADOCommand1->CommandText = "create table pictures(id autoincrement, filename TEXT(255), notes text(255), category text(20), rank int, filedate datetime,constraint table1_PK primary key(id));";
 ADOCommand1->Execute();
 AddFiles(Edit1->Text);
}
//---------------------------------------------------------------------------

int AddFiles(AnsiString path, int count)
{
 TSearchRec sr;
 int f,count2=0;
 f = FindFirst(path+"\\*.*", faAnyFile, sr);
 while( !f )
 {
  if(sr.Attr & faDirectory)
  {
   if(sr.Name != "."   &&   sr.Name != "..")
   {
    AnsiString subpath;
    subpath.sprintf("%s%s%s", path, "\\", sr.Name);
    count = AddFiles(subpath,count);
   }
  }
  else
  {
   Form1->ADOCommand1->CommandText = "Insert into pictures (filename) values ('" + StringReplace(path + "\\" + sr.Name, "'", "''", TReplaceFlags()<<rfReplaceAll) + "')";
   Form1->ADOCommand1->Execute();
   ++count;
   ++count2;
   if (count2 > 100)
   {
    count2 = 0;
    Form1->Caption = "Added " + IntToStr(count)+ " Files.";
    Application->ProcessMessages();
   }

  }
  f = FindNext(sr);

 }
 FindClose(sr);
return count;
}

기본적으로 주어진 디렉토리와 해당 서브 디르를 가로 지르고 각 파일 (경로 포함)을 MS 액세스 데이터베이스에 추가합니다.

(저는 유일한 사용자이므로 보안에 대해별로 신경 쓰지 않습니다)

많은 파일을 사용하면이 코드는 끔찍하게 느립니다. 누구나 코드가하는 일을하는 더 좋은 방법을 설명 할 수 있습니까?

도움이 되었습니까?

해결책

코드의 병목 현상은 대부분 Ado/Access 데이터베이스 계층 일 가능성이 높습니다. 디렉토리 수준 함수 (findFirst (), findNext ())는 비교적 빠릅니다. 해당 호출을 Cout 문으로 바꾸어 데이터베이스가 병목 현상인지 확인할 수 있습니다. 내 생각에 결과를 콘솔에 출력 할 때 훨씬 빠르게 실행될 것입니다.

내 경험상 액세스는 고성능 데이터베이스가 아니며 ADO 드라이버는 기본 드라이버만큼 빠르지 않습니다. 데이터베이스를보다 심각한 데이터베이스로 교체하면 성능이 향상 될 것입니다.

다른 팁

먼저 - 테이블을 드롭/만들 필요가 없습니다. 한 번 만들고 재설정하려면 "사진에서 삭제"를 호출하십시오. 두 번째-"form1-> adocommand1-> execute ();" 그리고 얼마나 빨리 얻는 지보십시오. 이것은 문제가 데이터베이스에 저장되는지 보여줍니다.

미래에 심각한 물건을 개발할 계획이라면 더 나은 데이터베이스 솔루션을 위해 라운드를 찾는 것이 좋습니다. (파이어 버드 내장, MySQL 내장 등).

MySQL에는 있습니다 CBUILDER 구성 요소 - 사용하기에 아주 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top