2012-02-13 131 views
0

我有以下代碼;SQL Server CE不支持DataReader.HasRows?

Dim rdr As SqlCeDataReader = cm_sel.ExecuteReader 
    If rdr.HasRows Then 
    While rdr.Read 
     Documents.DeleteDocument(rdr.Item("fID")) 
    End While 
    End If 

我得到的錯誤是:如果 底層光標不在滾動

的SQL Server Compact不支持HasRows屬性電話。

那麼在實際讀取DataReader之前,我該如何檢查數據是否存在?

編輯

整個代碼:

Dim con As New SqlCeConnection(ConfigurationManager.ConnectionStrings("MyConnectionString").ToString) 
Dim cm_sel As New SqlCeCommand("SELECT fID FROM Files WHERE fCatID=" & catID, con) 
    Try 
    con.Open() 
    Dim rdr As SqlCeDataReader = cm_sel.ExecuteReader 

     If rdr.HasRows() Then 
     While rdr.Read 
      Documents.DeleteDocument(rdr.Item("fID")) 
      End While 
     End If 

     Return "{'result':'ok'}" 
    Catch ex As Exception 
     Return "{'result':'error'}" 
     Finally 
      con.Close() 
      con.Dispose() 
     End Try 
+0

對我來說,似乎問題不在於HasRows不支持(因爲問題的標題暗示),而是它在您使用它的方式中不受支持。你可以在你設置'cm_sel'的地方顯示代碼嗎? – 2012-02-13 21:51:39

+0

如果底層遊標不可滾動,[SQL Server Compact不支持對HasRows屬性的調用。](http://stackoverflow.com/questions/7599994/sql-server-compact-does-not-support-呼叫到hasrows-property-if-the-underlying) – 2012-02-13 21:54:58

回答

5

你可以直接撥打電話reader.Read,因爲如果沒有行會返回false。只需刪除圍繞whileif聲明即可。

更新的代碼:

Dim rdr As SqlCeDataReader = cm_sel.ExecuteReader 
    While rdr.Read 
     Documents.DeleteDocument(rdr.Item("fID")) 
    End While 
+0

但是不會將all.Read方法提前讀取一條記錄嗎? 我正在編輯帖子以反映整個代碼。 – 2012-02-13 22:03:08

+0

不,結帳http ://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.read.aspx#Y456。當您第一次調用'Read'時,它指向第一個記錄 – 2012-02-13 22:07:28

+0

我期待對於不存在的非現有記錄錯誤,但仍然沒有得到HasRows屬性不能支持(不是不支持)。我認爲數據庫與支持該屬性無關。 – 2012-02-13 22:16:35

0

這對於上述問題工作正常。

Dim hasrows As Boolean 
hasrows = False 
While (rdr.Read()) 
    hasrows = True 
End While 
If (hasrows) Then 
    --do something 
else 
--do something else 
end if 

If you assign hasrows function to any Boolean and try to use it, the reader can jump to second record. The above solution will avoid that scenario as well.