【发布时间】:2015-09-29 11:08:58
【问题描述】:
我有一个项目 ID 列表(12345、23456 等),但其中大约有 7000 个。 我正在做的是获取列表中的每个项目并将它们传递给存储过程以获取另一个数字,如果它符合过程中的标准。下面是 C# 代码:
cmd.Parameters.Add("@itemId", SqlDbType.NVarChar);
cmd.Parameters.Add("@division", SqlDbType.NVarChar);
foreach (var item in itemNumber)
{
cmd.Parameters["@itemId"].Value = item;
cmd.Parameters["@division"].Value = CboRequestDivisions.SelectedValue;
reader = cmd.ExecuteReader();
while (reader.Read())
{
CboProductionOrder.Items.Add(reader[0].ToString());
}
reader.Close();
}
这是存储过程:
Select replace(PRODID,'Prod-','') from PRODTABLE where itemID = @itemId and (PRODSTATUS ='0' or PRODSTATUS = '2' or PRODSTATUS = '3' or PRODSTATUS = '4') and Dimension2_ = @division order by PRODID asc
调用这个过程来查找结果 7000 并发时间是荒谬的。有没有办法对每个项目进行线程化,所以我一次调用该过程多次。现在浏览这些项目大约需要 20 分钟
【问题讨论】:
-
您正在调用存储过程 7000 次?没有更好的方法可以做到这一点吗?我不一定建议这样做,但是您可以使存储过程将
datatable作为参数,这将大大减少您运行此处理的时间。您必须在数据库中定义一个用户定义的表才能使用它 -
看看 SqlBulkCopy 类。然后使用该类 ETL 到临时表并从临时表的选择中插入
标签: c# list stored-procedures