我有一个用 C# .NET 2.0 编写的小型控制台应用程序。应用程序查询数据库并获取一定数量的 id 编号,然后它通过这些编号寻址 Web 服务并根据 id 编号获取一些“状态”。然后将状态写回数据库。在整个过程中,我保持与数据库的开放连接,只要应用程序阻塞数据库引擎并且其他客户端无法正常工作,我不确定这是否是批处理的最佳方式。为每个操作打开和关闭连接似乎也不明智。
处理这些批处理过程的最佳方法是什么?
我有一个用 C# .NET 2.0 编写的小型控制台应用程序。应用程序查询数据库并获取一定数量的 id 编号,然后它通过这些编号寻址 Web 服务并根据 id 编号获取一些“状态”。然后将状态写回数据库。在整个过程中,我保持与数据库的开放连接,只要应用程序阻塞数据库引擎并且其他客户端无法正常工作,我不确定这是否是批处理的最佳方式。为每个操作打开和关闭连接似乎也不明智。
处理这些批处理过程的最佳方法是什么?
If you have loads of ids and want to update them all in a one go (a batch)
,您可以形成两个 CSV 字符串并将它们作为参数传递给存储过程(sp)。
您还需要一个函数来拆分(这里有一些)sp 中的那些 CSV,然后更新您的表格。
前任;
//Make sure you have a relation between id and statusid here. i.e. same index
string csvIds = "101,2234,349,..."; //CSV for ids
string csvStatusIds = ="1,2,3,..."; //CSV for statusIds
//Pass above csv lists to the following stored procedure...
//Create a stored procedure to pass above ids.
CREATE PROCEDURE [dbo].[updateStatuses]
@Ids VARCHAR(Max),
@StatusIds VARCHAR(Max)
AS
BEGIN
DECLARE @tblIds TABLE (key1 INT IDENTITY(1,1), myId INT)
DECLARE @tblStatusIds TABLE (key2 INT IDENTITY(1,1), myStatusId INT)
INSERT INTO @tblIds
SELECT ITEMS FROM dbo.Split(@Ids,',')
INSERT INTO @tblStatusIds
SELECT ITEMS FROM dbo.Split(@StatusIds,',')
--//Do your status update here
UPDATE yt.statusId = s.myStatusId
FROM [YourTable] yt JOIN @tblIds i
ON yt.id = i.myId JOIN @tblStatusIds s
ON i.key1 = s.key2
END
您可以尝试自己实现批量插入/读取,但令人惊讶的是,这正是 NIBerate 擅长的地方。我建议设置它并尝试一下,因为它的工作量相对较小,而且收益可能令人难以置信。