最近遇到关于批量存取图片的问题:
最近想做一个关于客户管理的小东西,手中有一个文本。文本文件里边记录了客户的资料:id/姓名/地址
另外有客户的相片,其中相片的命名方式是:客户的id作为文件名
现在想将客户的资料和相片同时存入数据库
预定使用的数据库为:paradox或access
请教各位大侠:对于相片的批量插入该如何解决?
1、是先将文本插入数据库,最后再插入相片?还是客户资料和相片同时插入?
2、数量大的话效率如何?

解决方案 »

  1.   

    做过Access(ADO连接)的1 都可以。另外如果我没记错的话Access文件本身不能超过2G,这个需要注意。2 效率还行,感觉上没有vb+access (DAO编程)快,具体要看你的记录数以及每张图片的字节数。
      

  2.   

    存取图片通用的方法是使用流。但如果对此不熟悉,devexpress有一个现存的组件:tcxdbimage
      

  3.   

    (1).用 LoadFromFile 的方法
     Table1.Insert; // 將圖片存至 Table1 的 Field1 欄位
     Table1Field1.LoadFromFile('c:\Windows\Waves.bmp');
     Table1.Post; (2).用 LoadFromStream 的方法
     var FS: TFileStream;
     begin
      Table1.Insert;
      FS := TFileStream.Create('c:\Windows\Winlogo.bmp', fmOpenRead);
      try
       Table1Field1.LoadFromStream(FS);
      finally
       FS.Free;
      end;
      Table1.Post;
     end;2.將 Blob 欄位取出, 在 Image1 上顯示:
    uses jpeg;
    var Stream1: TFileStream;
    jpeg: TJPEGImage;
    begin
     Stream1 := TBlobStream.Create(Table1Field1, bmRead); // 將 Table1 的 Field1 欄位取出
     try
      jpeg.LoadFromStream(Stream1);
      Image1.Picture.Assign(jpeg);
     finally
      jpeg.Free;
      Stream1.Free;
     end;
    end;
      

  4.   

    这是遍历文件夹的示例代码
    procedure TForm1.Button1Click(Sender: TObject);var
      sr: TSearchRec;
      FileAttrs: Integer;
    begin
      StringGrid1.RowCount := 1;
      if CheckBox1.Checked then
        FileAttrs := faReadOnly
      else
        FileAttrs := 0;
      if CheckBox2.Checked then
        FileAttrs := FileAttrs + faHidden;
      if CheckBox3.Checked then
        FileAttrs := FileAttrs + faSysFile;
      if CheckBox4.Checked then
        FileAttrs := FileAttrs + faVolumeID;
      if CheckBox5.Checked then    FileAttrs := FileAttrs + faDirectory;
      if CheckBox6.Checked then
        FileAttrs := FileAttrs + faArchive;
      if CheckBox7.Checked then    FileAttrs := FileAttrs + faAnyFile;  with StringGrid1 do
      begin
        RowCount := 0;    if FindFirst(Edit1.Text, FileAttrs, sr) = 0 then    begin
          repeat
            if (sr.Attr and FileAttrs) = sr.Attr then
            begin
            RowCount := RowCount + 1;
            Cells[1,RowCount-1] := sr.Name;
            Cells[2,RowCount-1] := IntToStr(sr.Size);
            end;
          until FindNext(sr) <> 0;
          FindClose(sr);
        end;
      end;
    end;
      

  5.   

    我现在已经实现了模型了
    我先从文本读取客户id,然后根据客户id在特定目录下查找以该id命名的相片
    最后将客户信息、相片一同插入数据库
    读取完一个客户信息、接着第二个……直到文本结束
    已经实现功能。
    欢迎大家继续提供思路、或者是效率上的意见,谢谢!
      

  6.   

    不用查找文件,你的图片应该在同一目录下吧?那就不用去FindFirst,FindClose了,先用FileExists判断文件是否存在,存在就存入,否则留空值
      

  7.   

    CrazyAlexster()这位朋友的想法跟我所作的模型不谋而合
    我还想听听大家的其他思路、建议
    稍后结帖
      

  8.   

    模型虽然已经开发出来,但却一直未进行大量数据的测试
    极度怀疑delphi+Access的效率
    昨天我试着用Access结果程序运行了一个半小时,而同样的程序、同样的数据改用Paradox却只需1分40秒左右,使用Paradox也有个大缺点:使用很不方便。表连接、合成表等方面存在较大缺撼
    (同一部机器实测)
    所以我想如果这个小东西也用Access话大概也会遭遇相同的效率难题
    做过的请提供一些效率上的建议,谢谢!
    即将结帖。
      

  9.   

    把图片放入数据库,并不是一个好的做法。建议还是放在windows文件夹下合适。需要哪个图片,则查找该图片文件。
      

  10.   

    把图片放入数据库,并不是一个好的做法。建议还是放在windows文件夹下合适。需要哪个图片,则查找该图片文件。
    --------------------------
    请教这位大侠,如何实现?
    关键是这个图片能显示在报表里边,以便打印