02-01-15, 08:41 AM
إقتباس :السلام عليكم ورحمة الله وبركاته
اخي الفاضل
جزاك الله خيرا على وقوفك بجانبي ومساعدتي على اتمام المهمه بنجاح
بارك الله فيك
لكن هناك نقطه شيبتني لا أعلم سببها
كل ما اقوم بعمل قراءه للبيانات من القاعده يعطيني هذا الخطأ
كود :
كود :
There is already an open DataReader associated with this Command which must be closed first.
وهذا هو الكود المستخدم
كود :
كود :
Dim cmd As New SqlCommand("select * from " & table_name & " where " & DB1 & " = '" & txt1 & "'", cn)
Dim dr As SqlDataReader = cmd.ExecuteReader
dr.Read()
على الرغم انه لايوجد DataReader مفتوح قبل هذا الكود
قمت باغلاق الاتصال بالقاعده وفتحه من جديد لكن نفس المشكله
في حين ان هذا هو نفس الكود المستخدم مع قاعدة الاكسيس قبل تحويلها بعد تغيير الفئة من oledb الى sqlcommand
ما الحل
جزاك الله خيرا
الخطأ منطقي في كل مره تفتح اتصال يجب اغلاقه بعد تنفيذ المهمة سواء كان DataReader sqlcommand او اي عملية تستخدم للقراءة والتنفيذ.
تخيل معي انت تنفذ الكود التالي على التسلسل :
1- فتح الاتصال بالقاعده
2- ثم القراءة او تنفيذ الاوامر
ثم تاتي بعد ذلك لتنفيذ امر ما في الوقت نفسه الذي طبقت فيه الكود السابق او اي امر مشابه كما سبق
1- فتح الاتصال بالقاعده > سيخرج خطأ هنا والسبب لم تغلق الاتصال بعد تنفيذ الاوامر السابقه انت هنا تطلب فتح الاتصال وهو مفتوح اصلا سيتوقف التطبيق هنا ولن يواصل تنفيذ بقيت الاكواد.
2- ثم القراءة او تنفيذ الاوامر > لن يتم تنفيذه بسبب الخطأ السابق.
الكود الصحيح لتجاوز هذه المشكلة في جميع اوامر تطبيقك ( الفتح ، القراءة ، التنفيذ )
0- التحقق من الاتصال إذا كان مفتوح قم باغلاقه
1- وعند التنفيذ افتح الاتصال بالقاعدة
2- ثم القراءة او تنفيذ الاوامر
3- الان اغلق الاتصال
^ هذه الطريقة الصحيحه (للأتصال والقراءة او التنفيذ )
وبالتالي حل مشكلتك كما يلي
إذا كان الاتصال مفتوح ' If cn.State = ConnectionState.Open Then
قم باغلاقه' cn.Close()
End If
Dim cmd As New SqlCommand("select * from " & table_name & " where " & DB1 & " = '" & txt1 & "'", cn
قم باغلاقه' cn.Close()
End If
Dim cmd As New SqlCommand("select * from " & table_name & " where " & DB1 & " = '" & txt1 & "'", cn
افتح الاتصال' cn.Open()
Dim dr As SqlDataReader = cmd.ExecuteReader
dr.Read()
dr.Read()
اغلق الاتصال cn.Close
اغلق القراءة dr.Close
اغلق القراءة dr.Close
والان تم الانتهاء من المشكلة بفضل الله
وفقك الله
وفقك الله
