dbf表不停刷新,最大可有5w条以上记录.程序要求不停扫描此dbf表,把新增数据导入oracle.
但dbf表无唯一id之类的字段,
主要的代码如下,但效率太低.请大家看看怎么优化?
//打开dbf表(dbfsj.dbf)
with dbf_query do
begin
close;
sql.clear;
sql.add('select * from dbfsj ');
open;
end;
//定位到上次最后插入oracle的纪录,如果没有,就定位到第一条记录.
try
dbf_query.Locate('sj;kh', VarArrayOf([ora_lasttime,ora_lastcust]), [loPartialKey]);
except
dbf_query.first;
end;//如果有新增记录,逐条按dbf的记录构造sql语句(dtssql)
while not dbf_query.eof do
begin
dtssql := 'insert into ora_dbfsj (';
for i := 0 to dbf_Query.FieldCount-1 do
begin
if i <> dbf_Query.FieldCount-1 then
dtssql := dtssql + dbf_Query.Fields[i].FieldName+','
else
dtssql := dtssql + dbf_Query.Fields[i].FieldName+') values (';
end; for i := 0 to dbf_Query.FieldCount-1 do
begin
if i <> dbf_Query.FieldCount-1 then
begin
dtssql := dtssql + '''' + dbf_Query.Fields[i].asString+ ''','
else
dtssql := dtssql + '''' + dbf_Query.Fields[i].asString+ ''')' ;
end;
end;
//一条语句构造好之后,在oracle中执行,即插入一条dbf的记录.
with oracle_query1 do
begin
close;
sql.clear;
sql.add(dtssql);
try
execsql;
except
showmessage(dtssql);
end;
end; dbf_query.next; end; //最后处理的记录的两个字段的值
ora_lasttime := dbf_query.fieldbyname('sj').asstring;
ora_lastcust := dbf_query.fieldbyname('kh').asstring;
//把最后处理的两个字段值记录下来.
with oracle_query1 do
begin
close;
sql.clear;
sql.add('update sms_ls1 set lastcust='+''''+ora_lastcust+''''+',lasttime='+''''+ora_lasttime+''''+' where deptcode='+''''+ora_deptcode+'''' );
execsql;
end;最主要慢在读dbf的数据,和插入oracle这两个地方,请大家赐教,如何优化?
但dbf表无唯一id之类的字段,
主要的代码如下,但效率太低.请大家看看怎么优化?
//打开dbf表(dbfsj.dbf)
with dbf_query do
begin
close;
sql.clear;
sql.add('select * from dbfsj ');
open;
end;
//定位到上次最后插入oracle的纪录,如果没有,就定位到第一条记录.
try
dbf_query.Locate('sj;kh', VarArrayOf([ora_lasttime,ora_lastcust]), [loPartialKey]);
except
dbf_query.first;
end;//如果有新增记录,逐条按dbf的记录构造sql语句(dtssql)
while not dbf_query.eof do
begin
dtssql := 'insert into ora_dbfsj (';
for i := 0 to dbf_Query.FieldCount-1 do
begin
if i <> dbf_Query.FieldCount-1 then
dtssql := dtssql + dbf_Query.Fields[i].FieldName+','
else
dtssql := dtssql + dbf_Query.Fields[i].FieldName+') values (';
end; for i := 0 to dbf_Query.FieldCount-1 do
begin
if i <> dbf_Query.FieldCount-1 then
begin
dtssql := dtssql + '''' + dbf_Query.Fields[i].asString+ ''','
else
dtssql := dtssql + '''' + dbf_Query.Fields[i].asString+ ''')' ;
end;
end;
//一条语句构造好之后,在oracle中执行,即插入一条dbf的记录.
with oracle_query1 do
begin
close;
sql.clear;
sql.add(dtssql);
try
execsql;
except
showmessage(dtssql);
end;
end; dbf_query.next; end; //最后处理的记录的两个字段的值
ora_lasttime := dbf_query.fieldbyname('sj').asstring;
ora_lastcust := dbf_query.fieldbyname('kh').asstring;
//把最后处理的两个字段值记录下来.
with oracle_query1 do
begin
close;
sql.clear;
sql.add('update sms_ls1 set lastcust='+''''+ora_lastcust+''''+',lasttime='+''''+ora_lasttime+''''+' where deptcode='+''''+ora_deptcode+'''' );
execsql;
end;最主要慢在读dbf的数据,和插入oracle这两个地方,请大家赐教,如何优化?
解决方案 »
- 判断鼠标是否单击的函数是什么
- 关于listview的一个问题
- fsMDIForm的主窗口调子窗口怎么把值传到子窗口上,
- 小第初学DELPHI,想请一高人指点一二。
- 难题应该算
- 小议问题:DBGrid和StringGrid这两个控件的列标题的字体怎样居中?
- 鼠标键盘在指定时间内没有响应,系统自动进行保护. 有例子的贴出来!!!
- 假如我用了一个TImage控件再窗体中显示以图片,那么这个图片会放在那些文件里?(*.dcu,*.pas,*,dfm,*.res...)
- Delphi怎样使用存储过程参数
- API?CPU?内存?你可知,50?
- 用两个Tadoquery控件如何实现两个表的关联?
- delphi调用oracle的存储过程问题!
01-03 字节 最后更新时间
04-07 记录总数
08-09 文件头的字节数
10-11 每条记录的字节数
//打开dbf表(dbfsj.dbf)
with dbf_query do
begin
close;
sql.clear;
sql.add('select * from dbfsj ');
open;
end;
这一段执行的太慢,有没有效率高的代码?或者方法?