我有一個函數存儲爲系統中驗證的每個用戶生成的臨時信息。這個「會話ID」是一個存儲在會話表中的字符串,沿着被認證的用戶的原始ID並被給予所述會話標識符。正確SQL查詢命令與SQL Compact正在失敗
該函數刪除/ deauthenticate /該用戶是否存在通過作爲實施的另一方法無效的現有會話首先檢查如下:
int userId = 0;
SqlCeCommand cmd = new SqlCeCommand();
SqlCeParameterCollection sqlParams = cmd.Parameters;
sqlParams.AddWithValue("@User", userName);
cmd.Connection = this.conn;
cmd.CommandText = "SELECT Id FROM Users WHERE (Username = @User)";
userId = (int) cmd.ExecuteScalar()
cmd.Dispose();
此後它試圖找到該用戶的現有會話,這是爲了(通過不同的方法再次):
SqlCeCommand cmd = new SqlCeCommand();
SqlCeParameterCollection sqlParams = cmd.Parameters;
sqlParams.AddWithValue("@SID", mysession);
sqlParams.AddWithValue("@UID", myuserid);
cmd.Connection = this.Connection;
cmd.CommandText = "SELECT Id FROM UserSessions WHERE (SessionID = @SID) AND (User_Id = @UID)";
int foo = cmd.ExecuteNonQuery();
...失敗。不幸的是,沒有例外。所以我增加了一個不安全相當於使用非參數化查詢字符串:
cmd.CommandText = String.Format("SELECT Id FROM UserSessions WHERE (SessionID = '{0}') AND (User_Id = {1})", mysession, myuserid);
cmd.Prepare();
int bar = cmd.ExecuteNonQuery();
新增斷點,欲言又止,複製粘貼查詢到Visual Studio查詢工具,瞧,它確實工作。但在繼續之後,代碼中的查詢失敗以及。我無法找到這個煩人的問題的罪魁禍首,因爲沒有例外並且一切似乎都正確。數據存在,參數以適當的類型(字符串和整數)提供,我無法檢查。連接打開等等。
周圍任何人的任何線索?謝謝!
更新:過失,錯過了函數中使用的ExecuteScalar直到我修改了它用於測試的事實。它確實使用ExecuteScalar和返回null,以防萬一。
感謝您的漫長反應,我的壞。不知怎的,錯誤消失了。我認爲它可能與同步性有關,但它很奇怪。 – soze
@soze:如果您仍在使用ExecuteNonQuery,那麼代碼仍然存在問題,您仍應該修復它。 –