该程序能够运行。但是,当单击功能按钮时,错误表明数据读取器未关闭,我实际上已关闭。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()
答案 0 :(得分:1)
显然,您在某处创建了另一个数据阅读器而忽略了关闭。这说明了为什么你应该总是使用Using
块来创建这样的对象,因为你不能忽视它们,例如。
Using myDataReader = myCommand.ExecuteReader()
'Read data here.
End Using 'Data reader is implicitly closed here.
答案 1 :(得分:0)
您对cnnoledb
和cmdsearch
使用了相同的cmdupdate
对象。那不行。在整个应用程序中重复使用一个连接对象并不是一种好习惯。您需要为每次调用数据库创建一个新的连接对象,而只是共享连接字符串。
此外,MS Access在保持打开从中读取的连接时插入表中是一个非常糟糕的主意。这不是Sql Server;并发性不是Access的强项。最好的方法1)遍历整个DataReader并保留集合中插入的信息,然后在第一次连接完成后插入它,或者2)将所有这些组合成一个同时执行INSERT和INSERT的语句SELECT(是的,this is possible)。
最后......字符串连接?真?我以为我们已经过去了。现在每个人都应该知道如何使用参数化查询。它应该是他们教你的第一件事,也就是你自学时遇到的第一件事。 真的非常糟糕使用字符串连接将值放入类似的查询......即使是Access。