¿Cuál es una mejor manera de crear una base de datos de acceso de nombres de archivo usando C ++ Builder?

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

Pregunta

Pregunta final para la noche. Y disculpas por el completo novato de esto.

Tengo, con la ayuda de stackoverflow y google logrado lo siguiente ...

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;
}

Básicamente está atravesando un directorio dado y sus subdirectorios, y agregando cada archivo (con ruta) a una base de datos de MS Access.

(Soy el único usuario, así que no me importa mucho la seguridad)

Con una gran cantidad de archivos, este código es terriblemente lento. ¿Alguien puede describir una mejor manera de hacer lo que está haciendo el código? (Espero que sin hacer que su respuesta sea demasiado complicada. Soy un novato en este recuerdo)

¿Fue útil?

Solución

El cuello de botella en su código es probablemente la capa de base de datos ADO / Access. Las funciones de nivel de directorio (FindFirst (), FindNext ()) son relativamente rápidas. Puede verificar si la base de datos es el cuello de botella reemplazando esas llamadas con declaraciones cout. Supongo que se ejecutará mucho más rápido cuando envíe los resultados a la consola.

En mi experiencia, Access no es una base de datos de alto rendimiento, y los controladores ADO no son tan rápidos como los controladores nativos. Apuesto a que si reemplaza la base de datos con una base de datos más seria, encontrará un rendimiento mejorado.

Otros consejos

Primero: no es necesario soltar / crear la tabla. Créelo una vez y luego llame a "eliminar de imágenes", cuando desee restablecerlo. Segundo: comente " Form1- > ADOCommand1- > Execute (); " y ver cuánto más rápido se pone. Esto muestra si el problema está en guardar en la base de datos.

Si planea desarrollar algunas cosas serias en el futuro, le recomiendo que busque una mejor solución de base de datos. (Firebird incrustado, MySQL incrustado, etc.).

Para MySQL hay componentes CBuilder - muy bueno para usar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top