2016-12-01 83 views
-1

我困惑,爲什麼mySqlDataReader.Read停留在最後一個記錄和犯規EOF ..MysqlDataReader.Read停留在最後一個記錄和犯規EOF

這是我的私人的ExecuteSQL功能:

Private Function executeSQL(ByVal str As String, ByVal connString As String, ByVal returnRecordSet As Boolean) As Object 
    Dim cmd As Object 
    Dim objConn As Object 
    Try 
     If dbType = 2 Then 
      cmd = New MySqlCommand 
      objConn = New MySqlConnection(connString) 
     Else 
      cmd = New OleDbCommand 
      objConn = New OleDbConnection(connString) 
     End If 
     'If objConn.State = ConnectionState.Open Then objConn.Close() 
     objConn.Open() 
     cmd.Connection = objConn 
     cmd.CommandType = CommandType.Text 
     cmd.CommandText = str 
     If returnRecordSet Then 
      executeSQL = cmd.ExecuteReader() 
      executeSQL.Read() 
     Else 
      cmd.ExecuteNonQuery() 
      executeSQL = Nothing 
     End If 
    Catch ex As Exception 
     MsgBox(Err.Description & " @ExecuteSQL", MsgBoxStyle.Critical, "ExecuteSQL") 
    End Try 
End Function 

這是發生錯誤我的子叫它:

Using admsDB As MySqlConnection = New MySqlConnection("server=" & rs("server") & ";uid=" & rs("user") & ";password=" & rs("pwd") & ";port=" & rs("port") & ";database=adms_db;") 
        admsDB.Open() 
        connDef.Close() 
        rs.Close() 
        'get record on admsdb 
        Dim logDate As DateTime 
        Dim str As String 
        str = "select userid, checktime from adms_db.checkinout in_out where userid not in (select userid " & 
         "from adms_db.checkinout in_out join (select str_to_date(datetime,'%d/%m/%Y %H:%i:%s') tgl, fid from zsoft_bkd_padang.ta_log) ta " & 
         "on ta.fid=userid and tgl=checktime)" 
        Dim rsAdms As MySqlDataReader = executeSQL(str, admsDB.ConnectionString, True) 
        Dim i As Integer 
        'This is where the error is, datareader stuck on the last record and doesnt EOF 
        While rsAdms.HasRows 
         'i = i + 1 
         logDate = rsAdms(1) 
         'save to ta_log 
         str = "insert into ta_log (fid, Tanggal_Log, jam_Log, Datetime) values ('" & rsAdms(0) & "','" & Format(logDate.Date, "dd/MM/yyyy") & "', '" & logDate.ToString("hh:mm:ss") & "', '" & logDate & "')" 
         executeSQL(str, oConn.ConnectionString, False) 
         rsAdms.Read() 
        End While 

        'del record on admsdb 
        str = "truncate table checkinout" 
        executeSQL(str, admsDB.ConnectionString, False) 
       End Using 

我是新來vbnet,真的有一個關於它的小知識,,請幫我,,並預先感謝您..

+0

您是否收到實際的錯誤信息? –

+0

沒有實際的錯誤信息,它只是循環不結束並卡在最後一條記錄,, – XMozart

回答

1

問題是您使用HasRows屬性作爲循環終止表達式。該屬性的值永遠不會改變。讀者有行或者沒有。這不是檢查是否有行要閱讀,所以閱讀沒有效果。

您應該使用Read方法作爲您的標誌。數據讀取器開始時沒有加載行。每次調用Read時,它將加載下一行並返回True,或者如果沒有更多行要讀取,則返回False

如果您想在結果集爲空時執行特殊操作,通常只使用HasRows,例如,

If myDataReader.HasRows Then 
    '... 
Else 
    MessageBox.Show("No matches found") 
End If 

如果你不想把一個空的結果集作爲一個特殊的情況,那麼只需撥打Read

While myDataReader.Read() 
    Dim firstFieldValue = myDataReader(0) 
    '... 
End While 

注意,試圖調用Read會拋出異常之前訪問任何數據。

+0

謝謝,這解決了問題:) – XMozart