我有以下代碼:減少發送信息所需SqlCommands的數量,三個表
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的執行檢查,看是否Username
和password
是正確的,如果他們的account is not suspended
。它然後(應該)返回Row ID.
如果RowID > 0
那麼我們有一個有效的登錄。
下一個SQLCommand更新同一表中的IsOnline
狀態 下一個SQLCommand將用戶標識和日期時間插入到LogonHistory中。現在設置id
與Row Id
最後的SqlCommand執行插入我們從最後的命令得到了RowId
和User's Id
到UserLogOnHistory
。 (這使我們能夠快速查找)理論上來說,用於在此用戶註銷時更新LogonHistory。
我現在意識到這是一團糟!
所以對這些問題:
- 我如何獲得受上一命令表的ROWID。
- 如何優化查詢以減少執行的SQLCommands的數量 - 或者看起來是否合理?
[SQL注入警報](http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - 您應該**不**將您的SQL語句連接在一起 - 使用**參數化查詢**來代替以避免SQL注入 – 2015-02-08 09:14:47
我瞭解SQL注入 - 但由於這是一個私有API,並且公衆不能訪問另一個內部應用程序,所以這不是必需的。沒有人能夠注入。但我仍然應該使用參數,因爲這是良好的做法 – 2015-02-08 10:28:13