SQL Server - 更新表并返回已更新的行

时间:2016-07-31 18:03:56

标签: 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]  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);
        }
    }
}

这段代码确实有效,它会更新我要求更新的内容,但是我没有在数据表中得到任何内容,它总是更新但不选择。

如果我进行正常选择,它确实有用并提供信息。

有人知道如何在单个查询中更新并获取一些数据吗?

1 个答案:

答案 0 :(得分:3)

所以你的问题是:

  

如何使用C#更新SQL Server中的表并返回真正更新的表   行作为DataTable?

首先您的查询中存在多个问题。

您应该使用10,而不是真或假。 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作为执行上述所有工作的参数。它更整洁,更便于维护。