如何维护大量的小查询

时间:2012-11-26 09:59:29

标签: c# sql-server

我有一个用C#.NET 2.0编写的小型控制台应用程序。 应用程序查询数据库并获取一定数量的id号,然后根据id号码查询Web服务并获取一些“状态”。 然后将状态写回数据库。 通过整个过程,我保持与数据库的开放连接,只要应用程序阻止数据库引擎并且其他客户端无法正常工作,我不确定这是批处理的最佳方式。 打开和关闭每个操作的连接似乎也不太明智。

什么被认为是处理这些批处理过程的最佳方式?

2 个答案:

答案 0 :(得分:1)

If you have loads of ids and want to update them all in a one go (a batch),您可以形成两个CSV字符串并将它们作为参数传递给存储过程(sp)。

此外,您还需要一个功能来拆分(Here are a few)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

答案 1 :(得分:0)

您可以尝试自己实施批量插入/读取,但令人惊讶的是,这是NHiberate擅长的地方。我建议设置它并尝试,因为它的工作量相对较小,并且增益可能令人难以置信。