2017-06-13 66 views
0

我正面临一种情况,我需要一次将多达17,000行插入到SQL Server数据库中。我已经想出了两种方法来做到这一点,但是我被C#中的查询参数化绊住了。参数化的多行插入SQL Server

一个警告:我担心表现,但不排除其他 - 如果我正在做的操作需要8分钟,那么是否为数据插入添加另外5秒对10秒并不重要。如果数据插入在初始操作之上需要额外的10分钟,那么这是一件大事。

选项1:多行插入(分块)

第一个选择是做一个简单的多行插入:

INSERT INTO MyTable (FirstName, LastName, Age) 
    VALUES 
     ('Bob', 'Smith', 24), 
     ('Sally', 'Jones', 32), 
     ('Jennifer', 'Johnson', 23) 

我会通过一些建立几个这样的查询喜欢这个。然而

var queriesNeeded = people.Count/250; 

for (int i = 0; i < queriesNeeded; i++) 
{ 
    var records = people.Skip(i * 250).Take(250); 
    BuildAndExecuteQuery(records); 
} 

// Handle anything left over 
var leftoverRecords = people.Skip(queriesNeeded * 250); 
BuildAndExecuteQuery(leftoverRecords); 

,虽然我知道如何: - (它的意思是说明我的观点我在写这离我的头顶,所以几乎可以肯定有一个错误在这里这并不重要。)参数化一个基本的单行INSERT,我不知道如何去参数化一个INSERT,它可能有一个未知数量的变量。有没有办法做到这一点?我将如何去创建我的SqlCommand

选项2:SqlBulkCopy类

或者......我可以去SqlBulkCopy路线。我在这里唯一的问题是,我找不到任何指示如何参数化的东西,或者我甚至需要。我是否需要担心转义数据或处理参数?

+0

是记录了数据库中的表或其他一些输入? –

+1

使用表值参数,这是非常简单的。 https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine –

+1

或SqlBulkCopy与DataTable,这意味着您不必担心转义任何东西。 –

回答

0

与此内存容量复制没有太多的经验,但我可以肯定回答:

我不知道如何去paramaterizing,可以有 未知数量的变量的INSERT它。

您可以通过在用于将它们添加到查询中的相同循环中添加参数来执行此操作。

为了延长您的伪代码,你将取代这个:

BuildAndExecuteQuery(records); 

像这样的东西:

foreach record in records 
{ 
    Add parameter(s) to the query 
    Add the same parameter(s) to the command's Parameters collection 
} 
ExecuteQuery