Код, который вы получили, выглядит для меня нормально (за исключением того, что я бы также использовал фигурные скобки вокруг возвращаемого результата и изменил имена переменных, чтобы они соответствовали соглашениям об именах .NET):
The *Метод 1003 * будет вызываться только в считывателе, если:
- При обращении к
MoveNext()
или Current
в считывателе возникает исключение - Код с использованием вызовы итератора располагают на нем
Обратите внимание, что оператор foreach
автоматически вызывает Dispose
на итераторе, так что если вы написали:
foreach (DbDataRecord record in ExecuteQuery())
{
if (someCondition)
{
break;
}
}
, то это вызовет Dispose
на итераторе в конце блока, который затем вызовет Dispose
на FbDataReader
.Другими словами, все должно работать должным образом.
Если вам нужно добавить обработку исключений в метода, вам нужно будет сделать что-то вроде:
using (FbDataReader DBReader = FBC.ExecuteReader())
{
using (var iterator = DBReader.GetEnumerator())
{
while (true)
{
DbDataRecord record = null;
try
{
if (!iterator.MoveNext())
{
break;
}
record = iterator.Current;
}
catch (FbException e)
{
// Handle however you want to handle it
}
yield return record;
}
}
}
Лично я бы обработал исключение на более высоком уровне, хотя ...