不要分布式查询插入(opendatasource和openrowset),一条一条数据就插入太慢了。
各位大虾,有木有办法
9 个解决方案
#1
你是在Delphi里读取DBF文件, 然后写入MSSQL?
------------------------------------------------------------
数据连接控件支持事务, 提交速度很快.
如果是使用MSSQL脚本导DBF, 在导入前关闭数据库日志, 可以提高速度.
------------------------------------------------------------
数据连接控件支持事务, 提交速度很快.
如果是使用MSSQL脚本导DBF, 在导入前关闭数据库日志, 可以提高速度.
#2
我用delphi的控件去读取DBF,然后再插入到SQL server里,但速度很慢。
你的意思是添加个事务,速度可以加快吗
#3
第一步,别管那么多,先用SQL语句将DBF表内容全部导入SQL中的临时表,第二步再数据差异更新,将临时表的数据有选择地插入新表中,这样效率高。
#4
你的意思是添加个事务,速度可以加快吗
--------------------------------
是
var
I: Integer;
begin
//方法1 使用事务
con1.BeginTrans;
try
for I := 0 to 100 do
begin
qry1.SQL.Text := 'insert into Ta ...';
qry1.ExecSQL;
end;
con1.CommitTrans;
except
on E: Exception do
begin
con1.RollbackTrans;
raise Exception.Create(e.Message);
end;
end;
//方法2 MSSQL支持';'分隔, 可以拼接后提交, 如果数据量大, 可以考虑分段执行
try
qry1.SQL.Text := '';
for I := 0 to 100 do
begin
qry1.SQL.Text := qry1.SQL.Text + 'insert into Ta ...;';
end;
qry1.ExecSQL;
except on E: Exception do
raise Exception.Create(e.Message);
end;
end;
#5
嗯,谢谢两位。我想到方法了,每次更新后复制原来的DBF文件,在下次更新时就用要更新的数据DBF文件去跟上次复制的DBF的数据进行对比,然后差异的数据再插入到mssql的数据表中
#6
结贴了......
#7
你这样只是减少了处理的数据量.
如果数据量大的时候就需要考虑写入的优化了
#8
每次更新也就几十条数据,不过也加了事务,至于优化的话,有时间可以学下
#9
你的方法2,是不错的方法。
#1
你是在Delphi里读取DBF文件, 然后写入MSSQL?
------------------------------------------------------------
数据连接控件支持事务, 提交速度很快.
如果是使用MSSQL脚本导DBF, 在导入前关闭数据库日志, 可以提高速度.
------------------------------------------------------------
数据连接控件支持事务, 提交速度很快.
如果是使用MSSQL脚本导DBF, 在导入前关闭数据库日志, 可以提高速度.
#2
我用delphi的控件去读取DBF,然后再插入到SQL server里,但速度很慢。
你的意思是添加个事务,速度可以加快吗
#3
第一步,别管那么多,先用SQL语句将DBF表内容全部导入SQL中的临时表,第二步再数据差异更新,将临时表的数据有选择地插入新表中,这样效率高。
#4
你的意思是添加个事务,速度可以加快吗
--------------------------------
是
var
I: Integer;
begin
//方法1 使用事务
con1.BeginTrans;
try
for I := 0 to 100 do
begin
qry1.SQL.Text := 'insert into Ta ...';
qry1.ExecSQL;
end;
con1.CommitTrans;
except
on E: Exception do
begin
con1.RollbackTrans;
raise Exception.Create(e.Message);
end;
end;
//方法2 MSSQL支持';'分隔, 可以拼接后提交, 如果数据量大, 可以考虑分段执行
try
qry1.SQL.Text := '';
for I := 0 to 100 do
begin
qry1.SQL.Text := qry1.SQL.Text + 'insert into Ta ...;';
end;
qry1.ExecSQL;
except on E: Exception do
raise Exception.Create(e.Message);
end;
end;
#5
嗯,谢谢两位。我想到方法了,每次更新后复制原来的DBF文件,在下次更新时就用要更新的数据DBF文件去跟上次复制的DBF的数据进行对比,然后差异的数据再插入到mssql的数据表中
#6
结贴了......
#7
你这样只是减少了处理的数据量.
如果数据量大的时候就需要考虑写入的优化了
#8
每次更新也就几十条数据,不过也加了事务,至于优化的话,有时间可以学下
#9
你的方法2,是不错的方法。