提供源码请教问题:把EXCEL数据导入数据库!(40分)

O

okzjq

Unregistered / Unconfirmed
GUEST, unregistred user!
下面程序实现了把EXCEL数据导入数据库。
但有两个问题:
1。程序导入数时较慢,据量大时,程序处于死机状态!
请问怎样解决这个问题?
2。在导入数据时,如果出现主关键字数据重复,则出错,怎样在导入数据时
判断数据已经存在?然后根据选择覆盖和突略更新数据呢?
万分感谢你!!

procedure TForm1.Button1Click (Sender: TObject);
var
OpenDialog:TOpenDialog;
iCount:integer;
begin
if MessageDlg('是否真的导入Excel数据?',mtConfirmation,[mbYes,mbNo],0)
=mrYes then
try
openDialog:=TOpenDialog.Create(self);
openDialog.DefaultExt:='xls';
openDialog.Filter:='Microsof Excel 文件(*.xls)|*.xls';
openDialog.Execute;

if openDialog.FileName<>'' then
try
Screen.Cursor:=crSqlWait;
ExcelConn.Close;
ExcelConn.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;'
+'Data Source='+openDialog.FileName+';Mode=Read;Extended Properties=Excel 8.0;'
+'Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";'
+'Jet OLEDB:Engine Type=35;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;'
+'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";';
Excelconn.Open();


With ExcelQuery do
begin
Close;
SQl.Clear;
sql.Add('select number,name from [sheet1$]');
Prepared:=true;
Open;
end;

iCount:=ExcelQuery.RecordCount;
ADOQuery1.Last;
ADOQuery1.DisableControls;
Excelconn.BeginTrans;
ExcelQuery.First;

while not ExcelQuery.Eof do
begin
with adoCommand1 do
begin
//加判断条件
CommandText:='Insert into xsjk values('
+''''+Trim(ExcelQuery.FieldByName('Number').AsString)+''''+','
+''''+Trim(ExcelQuery.FieldByName('Name').AsString)+''''+')';
Execute;
end;
ExcelQuery.Next;
form1.StatusBar1.Refresh;
statusbar1.Panels[1].Text:='当前数:'+IntToStr(ExcelQuery.RecNo)
+'(共'+IntToStr(iCount)+'条)';
end;

ExcelConn.CommitTrans;
MessageDlg('数据导入成功!',mtInformation,[mbOK],0);
except
ExcelConn.RollbackTrans;
MessageDlg('数据导入失败!',mtInformation,[mbOK],0);
end;

finally
ADOQuery1.EnableControls;
//ExcelQuery.EnableControls;
ExcelQuery.Close;
ExcelConn.Close;
OpenDialog.Free;
screen.Cursor:=crDefault;
StatusBar1.Panels[1].Text:='';
end;
ADOQuery1.Close;
ADOQuery1.Open;

end;
 
能否做一个异常处理,遇到主关键字重复就跳过?

死机状态...可以做一个动态的进度条,同时调用
Application.ProcessMessages; 大概是这个吧.
数据量大,肯定会出现这种情况的.
 
你可以做一个同构的临时表,把主关键主重复的记录放进去然后显示给用户;
死机状态,你可以批量导入如50行或100行提交一次,提交前把SQL放在TSringList中,
注意千万不要用TMemo,然后再按boyface说的加一个Application.ProcessMessages及进度条!
 
to KingLongSoft:
为什么不能用TMemo?有什么特别的地方吗?
 
在导入数据时,如果出现主关键字数据重复,则出错,怎样在导入数据时
判断数据已经存在?然后根据选择覆盖和突略更新数据呢?

帮忙啊各位高手!!!急急,等了两天了,怎没人帮我啊!!!
 
to lmcui:因为TMemo会比TStringList慢十倍以上尤其是数据量大的时候!
 
我想你根本不用作程序,DELPHI中有数据转移工具
 
顶部