При попытке вызвать Close или Dispose в SqlDataReader я получаю исключение с истекшим временем ожидания. Если у вас есть соединение DbConnection с 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();
Если вы вызовете reader.Close () или reader.Dispose (), он выдаст исключение System.Data.SqlClient.SqlException:





это потому, что вы только что открыли программу чтения данных и еще не прошли через нее полностью. вам нужно будет .Cancel () ваш объект DbCommand, прежде чем вы попытаетесь закрыть еще не завершившееся средство чтения данных (а также DbConnection). конечно, используя .Cancel () - используя вашу команду DbCommand, я не уверен в этом, но вы можете столкнуться с другим исключением. но вы должны просто поймать это, если это произойдет.
Где вы на самом деле читаете данные? Вы просто создаете ридер, но не читаете данные. Это всего лишь предположение, но, возможно, у читателя есть проблемы с закрытием, если вы не читаете;)
DbDataReader rdr = cmd.ExecuteReader();
while(rdr.Read())
{
int index = rdr.GetInt32(0);
}
У Cruizer был ответ: вызовите command.Cancel ():
using (DbCommand cmd = connection.CreateCommand())
{
cmd.CommandText = sql;
using (DbDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
if (WeShouldCancelTheOperation())
{
cmd.Cancel();
break;
}
}
}
}
Также полезно знать, что вы можете вызвать Cancel, даже если читатель уже прочитал все строки (т.е. он не генерирует исключение "нечего отменять").
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();
}
Проблема возникает, если вы читаете ноль строк, одну строку или много строк.