我在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;
答案 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;
端;