2012-02-13 130 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.