Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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# SQL Server-更新表并返回更新的行_C#_Sql Server_Database - Fatal编程技术网

C# SQL Server-更新表并返回更新的行

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

我有一个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中的表并返回真正更新的表 行作为数据表

首先,您的查询中有多个问题

您应该使用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语句。更新查询从不返回数据!我认为这不好,因为我只需要得到更新的人。。可能吗?