Delphi:访问表行或列,找到将数据从一个表复制到另一个表的方法

时间:2015-07-06 19:52:46

标签: sql-server oracle delphi

我在Oracle中有一个数据库,我使用实用程序将其复制到SQL Server,但在一些包含许多行的表中失败了。所以,现在他们告诉我使用Delphi将每个失败的表复制到SQL服务器中。 Oracle模式和SQL服务器中的表模式相同,字段类型相同,实用程序成功。我可以使用什么方法?将每个Column数据复制到SQL Server表中或获取每一行,将数据放入变量,然后在SQL Server中插入一行? 我从这段代码开始

i := 0;
SQLDataSet1.CommandText := 'SELECT * FROM LTROUSERS WHERE rownum='+i;
SQLDataSet1.Open;
//how can I get whole row here?

while not SQLDataSet.Eof do
begin
  //get next row
  SQLDataSet.Next;
  i:=i+1;
end;

SQLDataSet1.Close;
SQlDataSet2.Close;

2 个答案:

答案 0 :(得分:2)

如果您真的在谈论500万行,我希望您不会期望在" live"数据库,其他人正在使用这些数据库进行插入/更新/删除。您可能会导致源和/或目的地停止,除非您小心不要。

考虑a)在将源表导出到文本文件时使源数据库脱机,然后b)使用SqlServer的BCP实用程序(如果您愿意,在自动化控制下)导入文本文件。这样,你应该会发现你可以在SqlServer上每秒导入几行k行,相比之下,几十行是逐行拷贝。 (您将有时间从头开始学习BCP并编写代码以便在比行数复制所需的5M行更短的时间内使用它。)

答案 1 :(得分:0)

我不知道您使用的是哪种数据库访问方法,但此示例在此假设为ADO。您可以将其适合您正在使用的任何访问方法。如果您使用事务,则需要稍微修改一下。并且不要忘记使用try / except来处理错误,这样你就不会把你的记录留在奇怪的状态。

procedure CopyTable;
var FieldIndex : Integer;
  SQLDataSet1, OracleDataSet : Tadoquery;
begin
  SQLDataSet1.SQL.Text := 'SELECT * FROM LTROUSERS';
  SQLDataSet1.Open;

  {This assumes that the Oracle table name, Oracle column names, and
   Oracle column data types match SQL Server}
  OracleDataSet.SQL.Text := 'SELECT * FROM LTROUSERS';
  OracleDataSet.Open;

  {Consider adding transaction controls and error handling}
  while not OracleDataSet.EOF do
  begin
    SQLDataSet1.Insert;
    for FieldIndex := 0 to SQLDataSet1.Fields.Count-1 do
      SQLDataSet1.FieldByName(SqlDataSet1.Fields[FieldIndex].FieldName).AsVariant := OracleDataSet.Fields[FieldIndex].AsVariant;
    SQLDataSet1.Post;
    OracleDataSet.Next;
  end;

端;