C# 如何在sql server中更新表中的选择性行?

C# 如何在sql server中更新表中的选择性行?,c#,asp.net,sql,C#,Asp.net,Sql,我在一个应用程序中工作,在这个应用程序中,用户通过单击与每一行相关联的复选框来选择gridview中的一些行,并且在所选行中,数据库中只应更新一个值。 我使用下面的查询 update Items set bitIsTab = 1 where ReqID = 3 假设用户从gridview中选择了4个值,我必须将这4行bitIsTab设置为1。如何通过调用查询一次来更新这些行,或者我必须调用与所选记录数相同的查询次数。如果您知道 update Items set bitIsTab = 1

我在一个应用程序中工作,在这个应用程序中,用户通过单击与每一行相关联的复选框来选择gridview中的一些行,并且在所选行中,数据库中只应更新一个值。 我使用下面的查询

 update Items
 set bitIsTab = 1
 where ReqID = 3

假设用户从gridview中选择了4个值,我必须将这4行bitIsTab设置为1。如何通过调用查询一次来更新这些行,或者我必须调用与所选记录数相同的查询次数。

如果您知道

update Items
set bitIsTab = 1
where ReqID in (1,2,3,4)

好的,查询应该是这样的,要更新项目1,2,3,4:

 UPDATE Items
 SET bitIsTab = 1
 WHERE ReqID IN (1,2,3,4);
但是,可以使用
Linq

List<int> selectedIds = { 1, 2, 3, 4 };
var itemsToBeUpdated = (from i in yourContext.Items 
                        where selectedIds.Contains(i.ReqID)
                        select i);
itemsToBeUpdated.ForEach(i=>i.bitIsTab = 1);
yourContext.SubmitChanges();
然后使用“1,2,3,4”作为存储过程参数

要执行存储过程,请执行以下操作:

CREATE PROCEDURE sp_setTabItems
    @ids varchar(500) AS
 UPDATE Items
 SET bitIsTab = 1
 WHERE charindex(',' + ReqID + ',', ',' + @ids + ',') > 0;
 EXEC sp_setTabItems '1,2,3,4'
也可以以更可重用的方式完成,使用
bitIsTab
作为参数:

CREATE PROCEDURE sp_setTabItems
    @isTab bit,
    @ids varchar(500) AS
 UPDATE Items
 SET bitIsTab = @isTab 
 WHERE charindex(',' + ReqID + ',', ',' + @ids + ',') > 0;
并以这种方式执行:

EXEC sp_setTabItems '1,2,3,4',1

我更新了存储过程解决方案,因为比较
INT
VARCHAR
不会与
EXEC

一起工作,如果必须将数据作为独立ID列表传递,则需要为此编写一个函数

下面是函数

CREATE FUNCTION inline_split_me (@SplitOn char(1),@String varchar(7998))
RETURNS TABLE AS
    RETURN (WITH SplitSting AS
       (SELECT
            LEFT(@String,CHARINDEX(@SplitOn,@String)-1) AS Part
                ,RIGHT(@String,LEN(@String)-CHARINDEX(@SplitOn,@String)) AS Remainder
            WHERE @String IS NOT NULL AND CHARINDEX(@SplitOn,@String)>0
        UNION ALL
        SELECT
            LEFT(Remainder,CHARINDEX(@SplitOn,Remainder)-1)
                ,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(@SplitOn,Remainder))
            FROM SplitSting
            WHERE Remainder IS NOT NULL AND CHARINDEX(@SplitOn,Remainder)>0
        UNION ALL
        SELECT
            Remainder,null
            FROM SplitSting
            WHERE Remainder IS NOT NULL AND CHARINDEX(@SplitOn,Remainder)=0
       )
       SELECT Part FROM SplitSting
   )
一个简单的解决方案是

 DECLARE @id varchar(30)
 SET @id = '1,3,2'

 UPDATE [Items]
 SET bitIsTab = 0
 WHERE ReqID IN (
                    SELECT s
                    FROM dbo.Split(',', @id)
                )
在哪里


但如何将多个ReqID作为参数传递给ReqID总数不固定的过程?@AG-您可以将IEnumerable传递给procedure@FrancisP-我假设该方法是OP的方法,而不是LINQ/EF的东西。因此,在OP的方法中,传递IEnumerable并构建一个直接查询。
 DECLARE @id varchar(30)
 SET @id = '1,3,2'

 UPDATE [Items]
 SET bitIsTab = 0
 WHERE ReqID IN (
                    SELECT s
                    FROM dbo.Split(',', @id)
                )
 CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
 RETURNS table
 AS
 RETURN (
 WITH Pieces(pn, start, stop) AS (
 SELECT 1, 1, CHARINDEX(@sep, @s)
 UNION ALL
 SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
 FROM Pieces
 WHERE stop > 0
 )
 SELECT pn,
 SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
 FROM Pieces
 )