2011-09-23 68 views
0

我有一個函數存儲爲系統中驗證的每個用戶生成的臨時信息。這個「會話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,以防萬一。

回答

2

您使用ExecuteNonQuery

int foo = cmd.ExecuteNonQuery(); 

...但你顯然試圖執行一個查詢(一個SELECT)!再次使用ExecuteScalar,就像您在第一個代碼或ExecuteReader中所做的那樣,並適當查看結果。如果您堅持使用ExecuteScalar,則應首先檢查結果是否爲null以指示沒有結果。

ExecuteNonQuery返回受UPDATE/INSERT/DELETE命令影響的行數 - 這是它的用途。如下所示,我懷疑它會返回-1:

對於UPDATE,INSERT和DELETE語句,返回值是受命令影響的行數。當插入或更新的表上存在觸發器時,返回值包括受插入或更新操作以及觸發器或觸發器影響的行數影響的行數。 對於所有其他類型的語句,返回值爲-1。如果發生回滾,返回值也是-1。

(重點煤礦。)

+0

感謝您的漫長反應,我的壞。不知怎的,錯誤消失了。我認爲它可能與同步性有關,但它很奇怪。 – soze

+1

@soze:如果您仍在使用ExecuteNonQuery,那麼代碼仍然存在問題,您仍應該修復它。 –

1

使用set [],以避免與數據庫關鍵字歧義。

cmd.CommandText = "SELECT [Id] FROM [Users] WHERE ([Username] = @User)"; 

,並與SELECT語句工作時使用ExecuteScalar()ExecureReader()方法。

+0

謝謝,沒錯。固定! – soze