.صافي:SqlDataReader.أو من قريب .التخلص النتائج في مهلة انتهت استثناء
-
02-07-2019 - |
سؤال
عند محاولة الاتصال قريب أو التصرف على SqlDataReader أحصل على المهلة استثناء.إذا كان لديك دبكونيكشن إلى SQL Server يمكنك إعادة إنشاء ذلك بنفسك مع:
String CRLF = "\r\n";
String sql =
"SELECT * " + CRLF +
"FROM (" + CRLF +
" SELECT (a.Number * 256) + b.Number AS Number" + CRLF +
" FROM master..spt_values a," + CRLF +
" master..spt_values b" + CRLF +
" WHERE a.Type = 'p'" + CRLF +
" AND b.Type = 'p') Numbers1" + CRLF +
" FULL OUTER JOIN (" + CRLF +
" SELECT (print("code sample");a.Number * 256) + b.Number AS Number" + CRLF +
" FROM master..spt_values a," + CRLF +
" master..spt_values b" + CRLF +
" WHERE a.Type = 'p'" + CRLF +
" AND b.Type = 'p') Numbers2" + CRLF +
" ON 1=1";
DbCommand cmd = connection.CreateCommand();
cmd.CommandText = sql;
DbDataReader rdr = cmd.ExecuteReader();
rdr.Close();
إذا كنت استدعاء القارئ.Close() أو القارئ.Dispose() فإنه سيتم رمي النظام.البيانات.SqlClient.SqlException:
- رمز الخطأ:-2146232060 (0x80131904)
- الرسالة:"انتهت صلاحية المهلة.انقضت فترة المهلة قبل الانتهاء من العملية أو الملقم لا يستجيب."
المحلول
لأنه لديك فقط فتحت قارئ البيانات و قد يتحرك من خلال ذلك حتى الآن.سوف تحتاج إلى .إلغاء() الخاص بك DbCommand كائن قبل محاولة إغلاق قارئ البيانات التي لم تكتمل بعد (و دبكونيكشن كذلك).طبعا .إلغاء()-ing الخاص بك DbCommand أنا غير متأكد من هذا ولكن قد تواجه بعض الاستثناءات الأخرى.ولكن عليك أن قبض عليه إذا حدث ذلك.
نصائح أخرى
Cruizer كان الجواب:استدعاء الأمر.إلغاء():
using (DbCommand cmd = connection.CreateCommand())
{
cmd.CommandText = sql;
using (DbDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
if (WeShouldCancelTheOperation())
{
cmd.Cancel();
break;
}
}
}
}
ومن المفيد أيضا أن نعرف أن يمكنك الاتصال إلغاء حتى إذا كان القارئ قد قرأ بالفعل جميع الصفوف (أيلا رمي بعض "لا شيء على إلغاء" الاستثناء.)
DbCommand cmd = connection.CreateCommand();
try
{
cmd.CommandText = sql;
DbDataReader rdr = cmd.ExecuteReader();
try
{
while (rdr.Read())
{
if (WeShouldCancelTheOperation())
break;
}
cmd.Cancel();
}
finally
{
rdr.Dispose();
}
}
finally
{
cmd.Dispose();
}
أين يمكن قراءة البيانات ؟ أنت مجرد إنشاء قارئ ، ولكن ليس قراءة البيانات.إنه مجرد تخمين ولكن ربما القارئ لديه مشاكل لإغلاق إذا كنت لا تقرأ ;)
DbDataReader rdr = cmd.ExecuteReader();
while(rdr.Read())
{
int index = rdr.GetInt32(0);
}