“数据阅读器”已关闭,但错误显示不是

时间:2017-01-27 03:11:23

标签: database vb.net ms-access reader

该程序能够运行。但是,当单击功能按钮时,错误表明数据读取器未关闭,我实际上已关闭。1

任何解决方案都是善良的灵魂?

错误:已经有一个与此命令关联的打开的DataReader必须先关闭。

 Else
                    If checkoutdate.Value >= checkindate.Value Then

                        cmdsearch.CommandText = "SELECT * FROM [Reservations] where [ReservationID] = " & reservationidlbl.Text
                        cmdupdate.CommandType = CommandType.Text
                        cmdsearch.Connection = cnnoledb
                        Dim read3 As OleDbDataReader = cmdsearch.ExecuteReader()

                        If checkindate.Value & checkoutdate.Value >= read3(5) & read3(6) Then
                            If read3(5) & read3(6) <= checkindate.Value & checkoutdate.Value Then
                                cmdupdate.CommandText = "INSERT INTO [Reservations] (ReservationID, [RoomNo], CustomerName, [IC/Passport], ContactNo, [CheckIn_Date], [CheckOut_Date], RoomType, Deposit, ReservationDate,[Status]) values ( '" & reservationidlbl.Text & "' , '" & roomtxt.Text & "', '" & nametxt.Text & "', '" & passporttxt.Text & "', '" & contacttxt.Text & "','" & checkindate.Text & "','" & checkoutdate.Text & "','" & roomtype2 & "','" & deposittxt.Text & "','" & DateAndTime.Now.ToString & "', '" & status & "')"
                                cmdupdate.CommandType = CommandType.Text
                                cmdupdate.Connection = cnnoledb
                                cmdupdate.ExecuteNonQuery()

                                MsgBox("Reservation made.")
                            Else
                                MsgBox("This room is reserved for the specified date.")
                            End If
                            read3.Close()
                        Else
                            MsgBox("This room is reserved for the specified date.")
                        End If
                        read3.Close()

2 个答案:

答案 0 :(得分:1)

显然,您在某处创建了另一个数据阅读器而忽略了关闭。这说明了为什么你应该总是使用Using块来创建这样的对象,因为你不能忽视它们,例如。

Using myDataReader = myCommand.ExecuteReader()
    'Read data here.
End Using 'Data reader is implicitly closed here.

答案 1 :(得分:0)

您对cnnoledbcmdsearch使用了相同的cmdupdate对象。那不行。在整个应用程序中重复使用一个连接对象并不是一种好习惯。您需要为每次调用数据库创建一个新的连接对象,而只是共享连接字符串。

此外,MS Access在保持打开从中读取的连接时插入表中是一个非常糟糕的主意。这不是Sql Server;并发性不是Access的强项。最好的方法1)遍历整个DataReader并保留集合中插入的信息,然后在第一次连接完成后插入它,或者2)将所有这些组合成一个同时执行INSERT和INSERT的语句SELECT(是的,this is possible)。

最后......字符串连接?真?我以为我们已经过去了。现在每个人都应该知道如何使用参数化查询。它应该是他们教你的第一件事,也就是你自学时遇到的第一件事。 真的非常糟糕使用字符串连接将值放入类似的查询......即使是Access。