غير قادر على إغلاق OledbDataReader إلى قاعدة بيانات Sybase في VB.NET

StackOverflow https://stackoverflow.com/questions/126678

  •  02-07-2019
  •  | 
  •  

سؤال

لا يبدو أنني قادر على إغلاق كائن 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()

يتوقف تطبيق وحدة التحكم عند النقطة التي أحاول عندها إغلاق القارئ.لا يمثل فتح الاتصال وإغلاقه مشكلة، فهل لدى أي شخص أي أفكار حول سبب ذلك؟

هل كانت مفيدة؟

المحلول

لقد وجدت الجواب!

قبل

drSyBase.Close()

تحتاج إلى استدعاء طريقة الإلغاء لكائن الأمر

cmdSyBase.Cancel()

أعتقد أن هذا قد يكون خاصًا بقواعد بيانات Sybase

نصائح أخرى

هذه لقطة بعيدة، لكن حاول نقل خطوط .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

لقد مر وقت طويل منذ أن استخدمت VB.NET، ولكن الطريقة الأكثر أمانًا للتعامل مع هذا في C# هي استخدام "استخدام" إفادة.

انها مثل محاولة الالتقاط الضمنية ويتأكد من إغلاق/إلغاء جميع الموارد والتخلص منها عند انتهاء "الاستخدام".

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

تحديث:العثور على رابط حول استخدام العبارة في VB.NET 2.0, آمل أن يساعد.

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top