2017-01-27 12 views
0

プログラムを実行できます。しかし、機能ボタンがクリックされたとき、エラーは、データ・リーダーが閉じていないことを示しています。 1'データリーダー'は閉じていますが、エラーは表示されません。

どのような解決策もありますか?

エラー:このコマンドに関連付けられている開いているDataReaderが既に存在します。この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() 
+1

問題が発生しているコードを投稿しないと、間違ったことを解決するのは少し難しいです。 – Blackwood

+0

'End If'の後に次のように挿入します:' If read3.IsClosed = False Then read3.Close() ' – muffi

+0

取得している_exact_エラーメッセージを追加してください。 –

答えて

1

明らかにあなたがどこかに作成したと閉じるには無視別のデータリーダーがあります。これは、そのようなオブジェクトを作成するのにいつもUsingブロックを使用する必要がある理由のデモンストレーションです。

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

あなたはcmdsearchcmdupdateの両方に同じcnnoledbオブジェクトを使用しています。それは大丈夫じゃない。アプリ全体で1つの接続オブジェクトを再利用するのは良い方法ではありません。データベースへの呼び出しごとに新しい接続オブジェクトを作成し、代わりに接続文字列を共有する必要があります。

さらに、MS Accessがテーブルから読み込む接続を開いたままテーブルに挿入することは、本当に悪い考えです。これはSQL Serverではありません。並行性はAccessの強力なポイントではありません。 1)DataReader全体を通り、コレクションの挿入情報を保持し、最初の接続が完了したら挿入するか、2)INSERTとINSERTの両方を行う単一のステートメントをすべて組み合わせます。 SELECT(はい、this is possible)。

最後に...文字列concatention?本当に?私はそれを過ぎたと思った。誰もが今までにパラメータ化されたクエリを使用する方法を知っている必要があります。それは、彼らがあなたに教える最初のものの一つであるべきです、あなた自身のために学ぶときにあなたが出会う最初のもの。それは実際には本当に悪いそのようなクエリに値を入れるためにconcatentionを文字列を使用する... Accessの場合でも。

関連する問題