1

OledbDataReaderオブジェクトからデータを読み取った後、オブジェクトを閉じることができないようです。関連するコードは次のとおりです-

Dim conSyBase As New OleDb.OleDbConnection("Provider=Sybase.ASEOLEDBProvider.2;Server Name=xx.xx.xx.xx;Server Port Address=5000;Initial Catalog=xxxxxxxxxx;User ID=xxxxxxxx;Password=xxxxxxxxx;")

conSyBase.Open()

Dim cmdSyBase As New OleDb.OleDbCommand("MySQLStatement", conSyBase)
Dim drSyBase As OleDb.OleDbDataReader = cmdSyBase.ExecuteReader

Try

    While drSyBase.Read
     /*Do some stuff with the data here */

    End While

Catch ex As Exception

    NotifyError(ex, "Read failed.")

End Try

drSyBase.Close() /* CODE HANGS HERE */
conSyBase.Close()
drSyBase.Dispose()
cmdSyBase.Dispose()
conSyBase.Dispose()

リーダーを閉じようとした時点で、コンソールアプリケーションがハングします。接続の開閉は問題ではありません。したがって、これを引き起こしている可能性のあるものについて誰かが何か考えを持っていますか?

4

3 に答える 3

3

答えが見つかりました!

drSyBase.Close()

Commandオブジェクトのcancelメソッドを呼び出す必要があります

cmdSyBase.Cancel()

これはSybaseデータベースに固有の可能性があると思います

于 2008-09-24T13:04:17.627 に答える
0

VB.NET を使用してからしばらく経ちましたが、C# でこれを処理する最も安全な方法は、" using " ステートメントを使用することです。

これは暗黙の try-catchのようなもので、「使用」が終了したときにすべてのリソースが閉じられ、キャンセルされ、破棄されるようにします。

using (OleDb.OleDbConnection connection = new OleDb.OleDbConnection(connectionString)) 
{
    DoDataAccessStuff();
} // Your resource(s) are killed, disposed and all that

更新: VB.NET 2.0 の Using ステートメントに関するリンクが見つかりました。

Using conSyBase As New OleDb.OleDbConnection("Provider=Sybase.ASEOLEDBProvider.2;Server Name=xx.xx.xx.xx;Server Port Address=5000;Initial Catalog=xxxxxxxxxx;User ID=xxxxxxxx;Password=xxxxxxxxx;"), _
     cmdSyBase As New OleDb.OleDbCommand("MySQLStatement", conSyBase) 

    conSyBase.Open()
    Dim drSyBase As OleDb.OleDbDataReader = cmdSyBase.ExecuteReader

    Try
        While drSyBase.Read()

            '...'

        End While
    Catch ex As Exception
        NotifyError(ex, "Read failed.")
    End Try

    cmdSyBase.Cancel()
End Using
于 2008-09-24T13:09:31.530 に答える
0

これはロングショットですが、Try の Final ブロッ​​クで .Close() および .Dispose() 行を移動してみてください。このような:


Dim conSyBase As New OleDb.OleDbConnection("Provider=Sybase.ASEOLEDBProvider.2;Server Name=xx.xx.xx.xx;Server Port Address=5000;Initial Catalog=xxxxxxxxxx;User ID=xxxxxxxx;Password=xxxxxxxxx;")
conSyBase.Open()
Dim cmdSyBase As New OleDb.OleDbCommand("MySQLStatement", conSyBase)
Dim drSyBase As OleDb.OleDbDataReader = cmdSyBase.ExecuteReader
Try
  While drSyBase.Read
   /*Do some stuff with the data here */
  End While
Catch ex As Exception 
  NotifyError(ex, "Read failed.")
Finally
  drSyBase.Close() 
  conSyBase.Close()
  drSyBase.Dispose()
  cmdSyBase.Dispose()
  conSyBase.Dispose()
End Try
于 2008-09-24T12:20:46.747 に答える