DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jeff1314
今日帖子: 2
在线用户: 5
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 steelbull (铁牛) ▲▲▲△△ -
普通会员
2017/6/23 14:14:16
标题:
请教csv文件导入SQLITE数据库代码 浏览:2184
加入我的收藏
楼主: 用SQLITE的命令行导入csv等有标准分隔符的文件非常快,命令是.import table csv文件
但用命令行很麻烦,想在程序代码里面实现,但速度很慢。
我现在用的方法是调用sqlite3.dll,先把csv加到tstringlist里面,然后一行行的insert 数据库
用了事务处理,速度有所提高,但还是比命令行慢多了
请问有没有什么快的办法?读了sqlite的源码,没读懂
----------------------------------------------
-
作者:
男 a5824 (Return) ★☆☆☆☆ -
普通会员
2017/6/23 17:22:01
1楼: 整个提交到数据库,别一行行提交
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/6/23 17:28:09
2楼: 开启事务。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 delphiilove (乌羽玉) ★☆☆☆☆ -
普通会员
2017/6/24 0:04:43
3楼: 用 Navicat 管理工具
----------------------------------------------
-
作者:
男 hnljs (竹寨) ★☆☆☆☆ -
盒子活跃会员
2017/6/24 8:00:25
4楼:
procedure Tdm.ImportCSV(const asql: string);

var
MyTextFile:Textfile;
str, AFileName:string;
i,j,k,H,jl:integer;
 dd :array of string;
 TimeCount: TStopwatch;
 arr:  TArray<String>;

begin

OpenDialog1.Title := '请选择要打开的文件';
 OpenDialog1.Filter := '数据文件(*.txt)|*.txt|*.CSV|*.*';

 if  OpenDialog1.Execute()   then


begin

// showmessage(  OpenDialog1.FileName);


  Screen.Cursor:=crHourGlass;
  Application.CreateForm(Twaitform,waitform);
   waitform.Panel1.Caption :='正在导入数据,请等候..........';
waitform.Show;
waitform.Update ;


 AssignFile(MyTextFile,OpenDialog1.FileName );
  TimeCount := TStopwatch.Create;
 TimeCount.Start;



 Reset(MyTextFile);

 // ASQL:='INSERT INTO TEST(ID,NAME) VALUES (:ID,:NAME)';

 FQRY.FetchOptions.AutoClose := False; //
  FQRY.SQL.Text := ASQL;
 jl:=100000;
  FQRY.Params.ArraySize:=jl ; //准备把上面的语句执行 j 次


   H:=0;
   J:=0;

     // 文件第一行是标题

     if True then

     Readln(MyTextFile, str);



 while not Eof(MyTextFile) do
  begin
    Readln(MyTextFile, str);

    str:=str.Replace('"', '');
   arr:=str.Split([',']);
       for K := 0 to fqry.ParamCount -1 do
      BEGIN
          FQRY.Params[K].AsStrings[H] :=arr[k];

      END;

          inc(h);
   if  (H=jl) OR  Eof(MyTextFile)  then
     BEGIN
      J:=J+H;

       FConn.StartTransaction;
        TRY
       FQRY.Execute(h-1, 0);
         FConn.Commit;   //提交
         h:=0;
        except

         on E: Exception do
          begin
          dm.Fconn.Rollback ;
//  showmessage(asql);
        //     Application.ShowException(e.className,':',e.Message);
          end;


        END  ;


        end;

    END;


  end;



  CloseFile(MyTextFile);



    TimeCount.Stop;


    Screen.Cursor:=crDefault;
 waitform.FREE;
 //   showmessage(inttostr( Length(arr)));
    showmessage(format('追加记录 %D 条, 用时:%f秒'  ,[J, TimeCount.ElapsedMilliseconds / 1000]));




 end;
----------------------------------------------
-
作者:
男 hnljs (竹寨) ★☆☆☆☆ -
盒子活跃会员
2017/6/24 8:06:20
5楼: 数据导入截图
此帖子包含附件:
JPEG 图像
大小:25.0K
----------------------------------------------
-
作者:
男 delphiilove (乌羽玉) ★☆☆☆☆ -
普通会员
2017/6/24 11:21:57
6楼: 用 FireDAC 的 ArrayDML ,我试过 每秒 10 万条。
----------------------------------------------
-
作者:
男 wzwcn (wzw) ★☆☆☆☆ -
普通会员
2017/6/24 12:32:54
7楼: 开启事务,批量提交而不是每条都提交一次或全部插完再提交。比如每插200条就提交一次,这样会快很多
----------------------------------------------
-
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2017/6/27 13:05:17
8楼: http://zeoslib.sourceforge.net/viewtopic.php?t=3624
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 herui (hi) ★☆☆☆☆ -
普通会员
2017/6/28 8:12:08
9楼: to delphiilove,能给个示例吗?
----------------------------------------------
delphier
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行208.0078毫秒 RSS