c# - 减少向三个表发送信息所需的 SqlCommand 数量

标签 c# sql query-optimization azure-sql-database sqlcommand

我有以下代码:

command = new SqlCommand("SELECT UserId from Users WHERE Username = N'" + userName + " AND " + userPassword + "= N'" + userPassword + "AND AccountStatus = 0");
            command.CommandType = System.Data.CommandType.Text;
            command.Connection = conn;
            int uid = (int)command.ExecuteScalar();
            if(uid > 0)
            {            
                command = new SqlCommand("UPDATE IsOnline =" + true + " WHERE UserId = 'N" + uid);
                command.ExecuteNonQuery();
                command = new SqlCommand("INSERT INTO LogonHistory OUTPUT LogonHistoryId VALUES(NULL," + uid + "," + DateTime.Now + ")");
                int id = (int) command.ExecuteNonQuery();
                command = new SqlCommand("INSERT INTO UsersLogOnHistory VALUES(NULL," + uid + "," + id + ")");
                command.ExecuteNonQuery();
                IsAuthorised = true;
                SendMessage(ID, ServerCommands.Success, IsAuthorised.ToString());
            }
            else
            {
                // User does not exist 
                SendMessage(ID, ServerCommands.Failed, IsAuthorised.ToString());
            }

执行的第一个 SQLCommand 检查 用户名密码 是否正确,以及他们的帐户是否未暂停。然后(应该)返回 Row ID。

如果 RowID > 0 那么我们有一个有效的登录。

下一个 SQLCommand 更新同一个表中的 IsOnline 状态 下一个 SQLCommand 将用户 ID 和日期时间插入到 LogonHistory 中。现在使用 Row Id 设置 id 最后执行 SQLCommand 以将我们从上一条命令获得的 RowIdUser's Id 插入到 UserLogOnHistory 中。 (这使我们能够快速查找)- 理论上用于更新此用户注销时的 LogonHistory。

我现在意识到这是一团糟!

所以问题:

  1. 如何获取受上一条命令影响的表的 RowId。
  2. 我如何优化查询以减少执行的 SQLCommand 数量 - 或者这是否合理。

最佳答案

您可以通过简单地在一批中发出多个 TSQL 命令...包括多个 TSQL 命令。为了彻底,您应该用; 分隔它们,但在大多数(不是所有)情况下,这是可选的,没有它也可以工作。

获取最近插入的标识值; SCOPE_IDENTITY()。这只适用于 INSERT,并且只有在有 IDENTITY 列的情况下。在所有其他情况下:OUTPUT

注意;你应该参数化,但考虑:

UPDATE IsOnline = 1 WHERE UserId = @uid;
DECLARE @lhid int
INSERT INTO LogonHistory  (explict columns here)
VALUES(NULL,@uid, GETUTCDATE());
SET @lhid = SCOPE_IDENTITY();
INSERT INTO UsersLogOnHistory (explicit columns here)
VALUES(NULL,@uid, @lhid);

请注意,您还可以使用 LogonHistory 上的 INSERT 触发器或通过 OUTPUT 来完成最后几位操作。

这里的往返次数:1

关于c# - 减少向三个表发送信息所需的 SqlCommand 数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28388841/

相关文章:

sql - 如何使用内连接查询获取不同且最新的记录

c# - 我正在尝试在一个类中创建一个方法并尝试通过单击按钮从另一个类(表单)调用

c# - 如何在 C# 中使用 __doPostback

mysql - 如何根据条件从sql表中记录信息

sql-server - 索引插入期间的多个表假脱机(Eager 假脱机)

MySQL 查询运行时间更好,即使它的执行计划很糟糕

database - mysql:优化查询w/mixed-ascendency ORDER BY

c# - 字符串中的特殊字符.Replace

C# MySQL DataRow 具有多个值

SQL Group By 并分配最高值