غير قادر على إغلاق OledbDataReader إلى قاعدة بيانات Sybase في VB.NET
-
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