Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何维护大量的小查询_C#_Sql Server - Fatal编程技术网

C# 如何维护大量的小查询

C# 如何维护大量的小查询,c#,sql-server,C#,Sql Server,我有一个在C#.NET2.0上编写的小型控制台应用程序。 应用程序查询数据库并获取一定数量的id号,然后根据id号寻址web服务并获取一些“状态”。 然后将状态写回数据库。 在整个过程中,我保持与数据库的开放连接,只要应用程序阻止数据库引擎和其他客户端无法正常工作,我不确定这是否是批处理的最佳方式。 为每个操作打开和关闭连接似乎也不明智 处理这些批处理过程的最佳方法是什么?您可以尝试自己实现批插入/读取,但令人惊讶的是,这正是NHiberate擅长的地方。我建议设置并尝试一下,因为这相对来说工作

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


处理这些批处理过程的最佳方法是什么?

您可以尝试自己实现批插入/读取,但令人惊讶的是,这正是NHiberate擅长的地方。我建议设置并尝试一下,因为这相对来说工作量很小,而且获得的收益是难以置信的

如果您有大量ID,并且希望一次(一批)更新所有ID
,则可以形成两个CSV字符串,并将其作为参数传递给存储过程(sp)

您还需要一个函数来拆分()sp内的CSV,然后更新表


为什么打开和关闭连接是不明智的?你为什么要保持连接畅通?您不能有一个存储过程来处理所有ID更新吗?我知道SQL Server会缓存这些查询,因此您不必担心那里的性能。因为我尝试在每次更新时打开和关闭连接,每次大约有20000个。从您评论的第二部分中,我看到最好的方法是缓冲所有更新,然后将其一起发送到SP,而不是逐个更新值?是的,您可以缓冲它们,然后让SP为您处理更新。感谢您的详细回复。除了Id之外,还有一些额外的数据,如注释字符串等。您认为这种解决方案在这种情况下也是最佳的吗?是的,在以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