【发布时间】:2019-07-29 17:50:52
【问题描述】:
我在我的 asp.net 站点的网络表单中调用了大量存储过程,并在循环中执行。在大多数情况下,这很好,除非我使用更高的数量。事情变得非常缓慢。有没有其他方法可以让我的网站更高效?
例如,我有一个存储过程spReservePart,它执行以下操作:
-- Add the parameters for the stored procedure here
@startdate datetime, @enddate datetime, @SparePartID int, @notes nvarchar(MAX), @sr int, @assignto nvarchar(MAX), @newloc nvarchar(MAX)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
if (@sr = 0) begin set @sr = null end
Insert into Reservations (ReservationID, StartDate, EndDate, SparePartID, Notes, Status, SRNumber, AssignedTo)
Values (newid(), @startdate, @enddate, @SparePartID, @notes, 'Active', @sr, @assignto)
Update MiddleMan Set ReservationID = (Select Top (1) ReservationID from Reservations where SparePartID=@SparePartID and Status = 'Active') where SparePartID=@SparePartID
Update MiddleMan Set In_Use = 1 where SparePartID = @SparePartID
Update MiddleMan Set SRHistory = (Select Top (1) SRNumber from Reservations where SparePartID=@SparePartID and Status = 'Active') where SparePartID = @SparePartID
Update MiddleMan Set CurrentLocation = @newloc where SparePartID = @SparePartID
END
它来自的网络表单有一个带有复选框的 Gridview,对于每个选中的复选框,它都会调用这个存储过程。
foreach (GridViewRow item in gvreserveparts.Rows)
{//for each row in the gridview
var chk = (CheckBox)item.FindControl("cbSelect");
if (chk.Checked == true) //checkbox is checked
{
//assignment of parameters here
//create connection with database
OleDbConnection conn = new OleDbConnection(connectionInfo);
OleDbCommand cmd = new OleDbCommand();
conn.Open();
cmd.Connection = conn;
cmd.CommandText = "spReservePart";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@startdate", start);
cmd.Parameters.AddWithValue("@enddate", end);
cmd.Parameters.AddWithValue("@SparePartID", sparepartid);
cmd.Parameters.AddWithValue("@notes", notes);
cmd.Parameters.AddWithValue("@sr", sr);
cmd.Parameters.AddWithValue("@assignto", assignto);
cmd.Parameters.AddWithValue("@newloc", newloc);
cmd.ExecuteNonQuery();
conn.Close();
}
}
}
即使调用此 SP 的 6 次,也可能需要很长时间。因此,更有效的替代方案将非常有帮助。
【问题讨论】:
-
您可以使用表值参数,然后重新设计您的过程以设置为基础。
-
相关 - 不要使用addwithvalue
-
根据我的经验,最快的方法是使用
SqlBulkCopy插入临时表,然后调用存储过程来处理插入和更新作为集合操作。我发现这比使用表值参数或 XML(这是另一种选择)快很多倍。作为一个无关的点,你为什么使用OleDbConnection而不是SqlConnection来连接SQL Server? -
@SMor 虽然我完全同意使用强类型参数更可取,但性能问题在这里并不是什么大问题,因为它们使用的是存储过程。因此,数据类型解释不会发生,缓存也不是问题,因为它是被缓存的过程。
-
@SMor @Sean Lange 虽然我同意你们俩的观点,但我从未根据经验测试过添加强类型参数是否比
AddWithValue更快。我一直认为是的。你们中的任何一个人都检查过吗?
标签: asp.net sql-server loops stored-procedures