我有以下代码:
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 以将我们从上一条命令获得的 RowId
和 User's Id
插入到 UserLogOnHistory
中。 (这使我们能够快速查找)- 理论上用于更新此用户注销时的 LogonHistory。
我现在意识到这是一团糟!
所以问题:
- 如何获取受上一条命令影响的表的 RowId。
- 我如何优化查询以减少执行的 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/