[英]SQL Server - Update table and return the Updated rows
我有一个SQL Server数据库,里面有很多信息。
我想在单个查询中选择前50行(我这样做了,没有问题),但是随后我想将列从false更新为true,所以下次我选择不选择相同的行时,我的代码如下所示:
string Command = "UPDATE HubCommands SET [Alreadytaken] = 'true' FROM (SELECT TOP 50 [CommandId],[DeviceId],[Commandtext], [HashCommand],[UserId] FROM HubCommands) I WHERE [HubId] = '18353fe9-82fd-4ac2-a078-51c199d9072b'";
using (SqlConnection myConnection = new SqlConnection(SqlConnection))
{
using (SqlDataAdapter myDataAdapter = new SqlDataAdapter(Command, myConnection))
{
DataTable dtResult = new DataTable();
myDataAdapter.Fill(dtResult);
foreach (DataRow row in dtResult.Rows)
{
Guid CommandId, DeviceId, UserId;
Guid.TryParse(row["CommandId"].ToString(), out CommandId);
Guid.TryParse(row["DeviceId"].ToString(), out DeviceId);
Guid.TryParse(row["UserId"].ToString(), out UserId);
Console.WriteLine("CommandId" + CommandId);
}
}
}
这段代码确实有效,并且可以更新我要求更新的内容,但是我在数据表中什么也没得到,就像它总是在更新但没有选择一样。
如果我进行正常选择,它可以正常工作并提供信息。
有谁知道如何在单个查询中更新并获取一些数据?
所以你的问题是:
如何使用C#更新SQL Server中的表并将真正更新的行作为DataTable返回?
首先 ,您的查询中有多个问题。
您应该使用1
和0
,而不是true或false。 SQL-Server具有bit
数据类型,而不是Boolean
。
其次 ,这是您应该如何构造查询的方法:
DECLARE @IDs TABLE
(
[CommandId] uniqueidentifier
);
INSERT INTO @IDs
SELECT [CommandId] FROM HubCommands
WHERE [HubId] = '18353fe9-82fd-4ac2-a078-51c199d9072b' AND [Alreadytaken] = 0;
UPDATE HubCommands
SET [Alreadytaken] = 1
WHERE CommandId IN
(
SELECT [CommandId] FROM @IDs
);
SELECT * FROM HubCommands
WHERE CommandId IN
(
SELECT [CommandId] FROM @IDs
);
将以上所有内容包装在一个字符串中,并使用SqlDataReader
。 在这种情况下,不需要适配器(因为我们正在混合命令,这与适配器通常所做的不同):
var sqlCommand = new SqlCommand(Command, myConnection);
SqlDataReader dataReader = sqlCommand.ExecuteReader();
DataTable dtResult = new DataTable();
dtResult.Load(dataReader);
我强烈建议您创建一个存储过程,将HubId
作为参数来完成上述所有工作。 它更整洁,更易于维护。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.