我使用的是QueryMultiple
,它返回GridReader。Reader.IsConsumed爲false,但處理對象
因爲我不知道我有多少數據我會讀,我遍歷了讀者的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.
重新編輯:我建立了一個試驗檯與.NET 4.5,小巧玲瓏1.40.0,'SqlClient', *它一切正常*。 http://pastie.org/10733819 - 我很樂意嘗試和幫助 - 如果有錯誤:修復它。但我不能重現這個問題。你能幫我找到一個能夠按照你描述的方式打破的例子嗎? –
你可以像Marc一樣單獨測試相同的配置和測試,我想知道在多個上下文中使用相同的連接對象,比如並行任務,在這裏你可以獲得同一個GridReader的引用,並且其中一個讀取和關閉,因此消耗和其他投擲處理異常的對象 –
我添加了失敗的單元測試。我無法用一個足夠簡單的測試來重現ObjectDisposedException,但是我非常接近。我知道測試仍然複雜,但我不明白爲什麼它不應該工作。 – Mugen