我有一个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);
}
}
}
这段代码确实有效,它会更新我要求更新的内容,但是我没有在数据表中得到任何内容,它总是更新但不选择。
如果我进行正常选择,它确实有用并提供信息。
有人知道如何在单个查询中更新并获取一些数据吗?
答案 0 :(得分:3)
所以你的问题是:
如何使用C#更新SQL Server中的表并返回真正更新的表 行作为DataTable?
首先您的查询中存在多个问题。
您应该使用1
和0
,而不是真或假。 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
作为执行上述所有工作的参数。它更整洁,更便于维护。