用多线程写入数据库的问题(150分)

  • 主题发起人 主题发起人 ljzboy
  • 开始时间 开始时间
L

ljzboy

Unregistered / Unconfirmed
GUEST, unregistred user!
请问各位大虾,我要读取txt文件,然后import到sql server7.0里面。程序已经写好,但是我发现
太慢了,因为一个表就有30到40万条纪录,而且有几十个甘样的表。我想用多线程的办法来输入,
但是呢方面我是新手,而且不知道怎样划分线程好,是一次同时读取几个txt文件好呢?还是几个线程
同时读取一个文件好?请大家不吝赐教。欢迎讨论。拱手啦!![?]
 
我觉得每一个线程管一个表,比较容易实现
 
一次同时读取几个txt文件好点,也容易点
 
每个线程一个表容易实现
多个线程一个表速度快,但麻烦一些
 
各位可不可以给个具体的例子啊?呢方面我新手啊。多谢
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type

Tmythread = class(Tthread)
protected
mFile: string;
constructor create(s: string); overload;
procedure execute; override;
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

{ Tmythread }

constructor Tmythread.create(s: string);
begin
mFile := s;
inherited create(false);
end;

procedure Tmythread.execute;
var
strlst: TStringlist;
i: integer;
mRecord: string;
begin
inherited;
strlst := TStringList.Create;
strlst.LoadFromFile(mFile);
for i := 0 to strlst.Count -1 do
begin
mRecord := strlst; //一行一行读出文本中的记录
{ 写入数据库的语句 }
end;
strlst.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
mthread1,mthread2: TMythread;
begin
mthread1 := TMythread.create('c:/11.txt');
mthread2 := TMythread.create('c:/22.txt');
//...实现线程
end;

end.
 
多谢一少,我试试先。但最好能够多个线程一次一起读一个文件。
有没有几个线程同时读一个文件的例子啊?请教
 
没有人跟贴啦吗?
 
把 一少的程序稍加修改就可以多个线程处理一个文件了
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type

Tmythread = class(Tthread)
private
FnBeginPos:longint;
FnEndPos:longint;
FTTSringlist:TStrings;
protected
mFile: string;
constructor create(s: Tstrings;nBeginPos,nEndPos:Integer); overload;
procedure execute; override;
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

{ Tmythread }

constructor Tmythread.create(s: Tstrings;nBeginPos,nEndPos:Integer);
begin
FTTSringlist:=TStringlist.create;
FTTSringlist.clear;
FTTSringlist.Assign(s);
FnBeginPos:=nBeginPos;
FnEndPos:=nEndPos;

inherited create(false);
end;

procedure Tmythread.execute;
var

i: integer;
mRecord: string;
begin
inherited;
if nBeginPos>=FTTSringlist.count then
begin
FTTSringlist.free;
exit;
end;
if nEndPos>FTTSringlist.count then nEndPos:=FTTSringlist.count;
for i := nBeginPos to nEndPos-1 do
begin
mRecord := strlst; //一行一行读出文本中的记录
{ 写入数据库的语句 }
end;
FTTSringlist.free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
mthread1,mthread2: TMythread;
strlst: TStringlist;
begin

strlst := TStringList.Create;
strlst.LoadFromFile('c:/11.txt');
mthread1 := TMythread.create(strlst,0,10000);
mthread2 := TMythread.create(strlst,10000,strlst.count);
//...实现线程
strlst.Free;
end;

end.
 
To yanghai0437,
谢谢你的回答,但是我试过好像有点问题,运行不了,
出错行:mthread1:=tmythread.Create(sltxt,0,parts1);
提示:[Error] compare.pas(440): Incompatible types: 'Boolean' and 'TStringList'

点解?
 
我是用SQL SERVER自带的BCP.EXE追加,好快啊!
 
你的sltxt是不是定义成了boolean类型
procedure TForm1.Button1Click(Sender: TObject);
var
mthread1,mthread2: TMythread;
strlst: TStrings;//这里修改一下
begin

strlst := TStringList.Create;
strlst.LoadFromFile('c:/11.txt');
mthread1 := TMythread.create(strlst,0,10000);
mthread2 := TMythread.create(strlst,10000,strlst.count);
//...实现线程
strlst.Free;
end;
 
我是按你写的那样做,但还是不行
 
我猜想是由于 constructor tmythread.create(。。。)括号里面的参数问题,是不是这里不能加参数的?有人能详细解释一下吗?一解决这点,马上结帖
 
没有人回音啦?
 
加false自动执行execute部分,true要自己调用execute
 
我知道甘样设置,但还是有上面的错误提示,为什么?
 
个表就有30到40万条纪录,而且有几十个甘样的表。

你最好用bcp 最快
OpenDataSource 第二快
//SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:/Finance/account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

 
后退
顶部