C# SQL Server-更新表并返回更新的行
我有一个SQL Server数据库,里面有很多信息 我想在一个查询中选择前50行,这是我做的,没有问题,但我想将一列从false更新为true,因此下次选择时,我不会选择相同的行,我的代码如下所示:C# SQL Server-更新表并返回更新的行,c#,sql-server,database,C#,Sql Server,Database,我有一个SQL Server数据库,里面有很多信息 我想在一个查询中选择前50行,这是我做的,没有问题,但我想将一列从false更新为true,因此下次选择时,我不会选择相同的行,我的代码如下所示: string Command = "UPDATE HubCommands SET [Alreadytaken] = 'true' FROM (SELECT TOP 50 [CommandId],[DeviceId],[Commandtext], [HashCommand],[UserId] FRO
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中的表并返回真正更新的表
行作为数据表
首先,您的查询中有多个问题
您应该使用1和0,而不是true或false。SQL Server具有位数据类型,而不是布尔值
其次,这是您应该如何构造查询的:
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作为参数的存储过程,以完成上述所有工作。它更整洁,更便于维护。所以您的问题是:
如何使用C更新SQL Server中的表并返回真正更新的表
行作为数据表
首先,您的查询中有多个问题
您应该使用1和0,而不是true或false。SQL Server具有位数据类型,而不是布尔值
其次,这是您应该如何构造查询的:
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作为参数的存储过程,以完成上述所有工作。它更整洁,更便于维护。谢谢您提供的0和1信息,我不知道这一点。但这仍然没有向我返回任何信息。你知道为什么吗?thanks@AlonM这是一个update语句。是否要返回更新的记录?是。我需要它们,这样我就可以在我的代码中使用它们,正如您可以的那样,我正在尝试用这段代码将信息写入控制台,谢谢@AlonM检查编辑的答案和更新的查询。然后需要将Update语句分开;然后是一个单独的select语句。更新查询从不返回数据!我认为这不好,因为我只需要得到更新的人。。可能吗?谢谢你提供的0和1信息,我不知道。但这仍然没有向我返回任何信息。你知道为什么吗?thanks@AlonM这是一个update语句。是否要返回更新的记录?是。我需要它们,这样我就可以在我的代码中使用它们,正如您可以的那样,我正在尝试用这段代码将信息写入控制台,谢谢@AlonM检查编辑的答案和更新的查询。然后需要将Update语句分开;然后是一个单独的select语句。更新查询从不返回数据!我认为这不好,因为我只需要得到更新的人。。可能吗?