2010-07-01 63 views
3

我可以使用一些建议/想法。 我写了一个控制台应用程序,用于查询MS Access中一个表格中的所有数据(我知道,但是我继承了它)到一个SQL表格。它每天早上作为计划任务运行。两个表格之间的字段不相同。目前,我从MS Access表中选择所有数据,遍历数据集并将每行插入到SQL表中。我也在这个过程中写了一个快速的日志文件。它有效,但速度并不快。我将不胜感激您的任何想法,您可能必须改进此过程。 谢谢!复制SQL数据的最快方法

回答

4

SqlBulkCopy Class

这是方式不是个别insert语句更快。

您必须为主键增加自己的标识字段值。要做到这一点,首先抢你离开的最后一个标识字段值:

select top 1 id_customer from customers order by id_customer desc

然后通过你的DataSet增加的int变量,你循环。

或者您也可以使用GUID for primary key column。使用SqlBulkCopy的

示例代码:

public static void BulkLoadDataTable(DataTable table, string destinationTable) 
{ 
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(_connectionString)) 
    { 
    bulkCopy.BulkCopyTimeout = 1200; 
    bulkCopy.DestinationTableName = destinationTable; 
    bulkCopy.WriteToServer(table); 
    } 
}

强类型数据表:

using System; 
using System.Data; 

public class CustomersDataTable : DataTable 
{ 
    public CustomersDataTable() : base() 
    { 
    base.TableName = "Customers"; 
    Columns.Add(new DataColumn("id_customer", typeof(int))); 
    Columns.Add(new DataColumn("first_name", typeof(string))); 
    Columns.Add(new DataColumn("last_name", typeof(string))); 
    Columns.Add(new DataColumn("active", typeof(bool))); 
    } 
}
+0

创建自己的主键只有在插入数百万条记录的极端情况下才需要。但是我同意John的观点,即SqlBulkCopy是最好的选择。 – Doug 2010-07-01 16:39:29

+0

看起来像BulkCopyClass是要走的路。但是,当字段属性不匹配会发生什么?例如,访问中的字符串字段和SQL中的布尔字段。 – gnome 2010-07-01 16:54:04

+1

那么你可以遍历你的数据并按照你想要的方式在SQL Server中建立一个'DataTable',也就是'bool'的'bit'列。 SQL Server应该能够将非类型化的DataTable中的数据点转换为模式中适当的类型,但是我个人会创建一个**强类型的DataTable **(见上文)。你也可以写出一个.CSV和批量复制。在代码中循环执行所有这些工作将花费相对较少的时间。主要的观点是1000个单独的'insert'语句会浪费**吨的时间! – JohnB 2010-07-01 17:13:23

1

你看着SSIS包?我会先看看。如果您没有访问权限,请查看此处提到的SqlBulkCopy类。

你也可以使用SELECT statement with an INSERT看看。

+0

使用INSERT的SELECT语句会很慢。 – JohnB 2010-07-01 20:02:19

+0

是的,但它仍然比单个插入更快。这将是我的最后一个选择,但我想我会介绍这个选项。 SSIS将是我认为的方式。 – knight0323 2010-07-01 20:39:27

+0

为什么在SELECT语句中使用INSERT进行批量插入会很慢? – 2010-07-01 23:42:05

相关问题