把DBF文件导入到SQL server的表中

时间:2021-04-10 06:43:11
我要把DBF的数据差异更新到SQL 数据库中的表中,也可以先删除再插入
不要分布式查询插入(opendatasource和openrowset),一条一条数据就插入太慢了。
各位大虾,有木有办法

9 个解决方案

#1


你是在Delphi里读取DBF文件, 然后写入MSSQL?
------------------------------------------------------------
数据连接控件支持事务, 提交速度很快.

如果是使用MSSQL脚本导DBF, 在导入前关闭数据库日志, 可以提高速度.

#2


引用 1 楼 simonhehe 的回复:
你是在Delphi里读取DBF文件, 然后写入MSSQL?
------------------------------------------------------------
数据连接控件支持事务, 提交速度很快.

如果是使用MSSQL脚本导DBF, 在导入前关闭数据库日志, 可以提高速度.


我用delphi的控件去读取DBF,然后再插入到SQL server里,但速度很慢。
你的意思是添加个事务,速度可以加快吗

#3


第一步,别管那么多,先用SQL语句将DBF表内容全部导入SQL中的临时表,第二步再数据差异更新,将临时表的数据有选择地插入新表中,这样效率高。

#4


引用 2 楼 oKongShuiPing 的回复:
引用 1 楼 simonhehe 的回复:你是在Delphi里读取DBF文件, 然后写入MSSQL?
------------------------------------------------------------
数据连接控件支持事务, 提交速度很快.

如果是使用MSSQL脚本导DBF, 在导入前关闭数据库日志, 可以提高速度.

我用delphi……


你的意思是添加个事务,速度可以加快吗
--------------------------------



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


引用 5 楼 oKongShuiPing 的回复:
嗯,谢谢两位。我想到方法了,每次更新后复制原来的DBF文件,在下次更新时就用要更新的数据DBF文件去跟上次复制的DBF的数据进行对比,然后差异的数据再插入到mssql的数据表中


你这样只是减少了处理的数据量.


如果数据量大的时候就需要考虑写入的优化了

#8


引用 7 楼 simonhehe 的回复:
引用 5 楼 oKongShuiPing 的回复:
嗯,谢谢两位。我想到方法了,每次更新后复制原来的DBF文件,在下次更新时就用要更新的数据DBF文件去跟上次复制的DBF的数据进行对比,然后差异的数据再插入到mssql的数据表中

你这样只是减少了处理的数据量.


如果数据量大的时候就需要考虑写入的优化了


每次更新也就几十条数据,不过也加了事务,至于优化的话,有时间可以学下

#9


你的方法2,是不错的方法。

#1


你是在Delphi里读取DBF文件, 然后写入MSSQL?
------------------------------------------------------------
数据连接控件支持事务, 提交速度很快.

如果是使用MSSQL脚本导DBF, 在导入前关闭数据库日志, 可以提高速度.

#2


引用 1 楼 simonhehe 的回复:
你是在Delphi里读取DBF文件, 然后写入MSSQL?
------------------------------------------------------------
数据连接控件支持事务, 提交速度很快.

如果是使用MSSQL脚本导DBF, 在导入前关闭数据库日志, 可以提高速度.


我用delphi的控件去读取DBF,然后再插入到SQL server里,但速度很慢。
你的意思是添加个事务,速度可以加快吗

#3


第一步,别管那么多,先用SQL语句将DBF表内容全部导入SQL中的临时表,第二步再数据差异更新,将临时表的数据有选择地插入新表中,这样效率高。

#4


引用 2 楼 oKongShuiPing 的回复:
引用 1 楼 simonhehe 的回复:你是在Delphi里读取DBF文件, 然后写入MSSQL?
------------------------------------------------------------
数据连接控件支持事务, 提交速度很快.

如果是使用MSSQL脚本导DBF, 在导入前关闭数据库日志, 可以提高速度.

我用delphi……


你的意思是添加个事务,速度可以加快吗
--------------------------------



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


引用 5 楼 oKongShuiPing 的回复:
嗯,谢谢两位。我想到方法了,每次更新后复制原来的DBF文件,在下次更新时就用要更新的数据DBF文件去跟上次复制的DBF的数据进行对比,然后差异的数据再插入到mssql的数据表中


你这样只是减少了处理的数据量.


如果数据量大的时候就需要考虑写入的优化了

#8


引用 7 楼 simonhehe 的回复:
引用 5 楼 oKongShuiPing 的回复:
嗯,谢谢两位。我想到方法了,每次更新后复制原来的DBF文件,在下次更新时就用要更新的数据DBF文件去跟上次复制的DBF的数据进行对比,然后差异的数据再插入到mssql的数据表中

你这样只是减少了处理的数据量.


如果数据量大的时候就需要考虑写入的优化了


每次更新也就几十条数据,不过也加了事务,至于优化的话,有时间可以学下

#9


你的方法2,是不错的方法。