Я использую QueryMultiple
, который возвращает GridReader.Reader.IsConsumed является ложным, но объект был удален
Поскольку я не знаю, сколько данных я буду читать, я зацикливание над читателем с условием остановки IsConsumed
:
using (var reader = conn.QueryMultiple(mySql)) {
while(!reader.IsConsumed) {
reader.Read<...>
}
}
Однако, я всегда получаю ObjectDisposedException
на последнее прочитано. Значение IsConsumed
по-прежнему false
.
Я попытался передать DynamicParameters
запросу с целью получить обратный вызов (который, кажется, полезен через IParameterCallbacks
), но я не мог его исправить.
Я бы предпочел не иметь такого ожидаемого исключения в коде. Спасибо за любую помощь.
Я использую SQL Server, мой провайдер в .NET 4.5 System.Data.SqlClient
, Щеголеватый версия 1.40.0.0
провального тест, например:
[TestMethod]
public void QueryMultipleWithCursor()
{
const string sql = @"
DECLARE @CurrentDate DATE
DECLARE DatesCursor CURSOR LOCAL FOR
SELECT DISTINCT DataDate FROM Data_Table ORDER BY DataDate
OPEN DatesCursor
FETCH NEXT FROM DatesCursor INTO @CurrentDate
WHILE @@FETCH_STATUS = 0 BEGIN
SELECT DISTINCT
DataDate AS Date1,
DataDate AS Date2
FROM Data_Table
WHERE [email protected]
FETCH NEXT FROM DatesCursor INTO @CurrentDate
END
CLOSE DatesCursor
DEALLOCATE DatesCursor";
using (var conn = _database.GetConnection())
{
var reader = conn.QueryMultiple(sql);
while (!reader.IsConsumed)
{
reader.Read<DateTime, DateTime, DateTime>(
(date1, date2) => date1,
splitOn: "Date2").ToList();
}
}
}
Я получаю NullReferenceException
с следующий стек:
at Dapper.SqlMapper.GridReader.NextResult() in D:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 4440
at Dapper.SqlMapper.GridReader.<MultiReadInternal>d__9`8.System.IDisposable.Dispose()
at Dapper.SqlMapper.GridReader.<MultiReadInternal>d__9`8.MoveNext() in D:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 4309
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Dapper.SqlMapper.GridReader.Read[TFirst,TSecond,TReturn](Func`3 func, String splitOn, Boolean buffered) in D:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 4330
at Project.MyTests.QueryMultipleWithCursor() in C:\Project\MyTests.cs:line 171
Result Message:
Test method Project.MyTests.QueryMultipleWithCursor threw exception:
System.NullReferenceException: Object reference not set to an instance of an object.
Re редактирования: Я создал тестовую вышку с .NET 4.5, Щеголеватый 1.40.0, 'SqlClient', и все это отлично работает *. http://pastie.org/10733819 - Я рад попробовать и помогу - и если есть ошибка: исправьте это. Но я не могу воспроизвести эту проблему. Можете ли вы помочь мне привести пример, который ломается в том, как вы описываете? –
Можете ли вы попробовать автономный тест, такой как Marc, в той же конфигурации и тесте, мне интересно использовать один и тот же объект соединения в нескольких контекстах, таких как параллельная задача, где вы получаете ссылку на тот же GridReader и один из них читаете и закрываете, таким образом, потребляете и другие метания исключение объекта –
Я добавил неудачный модульный тест. Мне не удалось воспроизвести «ObjectDisposedException» с достаточно простым тестом, но я получил довольно близко. Я знаю, что тест все еще сложный, но я не понимаю, почему он не должен работать. – Mugen