我面临的情况是我需要一次将多达17,000行插入SQL Server数据库。我已经提出了两种方法来做到这一点,但我在C#中查询参数化时会被绊倒。
一个警告:我担心表现,但不要排除其他所有 - 如果我正在进行的操作需要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 :(得分:0)
这里没有太多内存批量复制的经验,但我当然可以回答这个问题:
我不知道如何对可以拥有的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