LINQ to SQL: ошибки из хранимой процедуры игнорируются после возврата набора результатов - PullRequest
3 голосов
/ 22 сентября 2009

Я использую LINQ to SQL для вызова хранимой процедуры. Эта хранимая процедура в настоящее время возвращает набор результатов, а затем имеет несколько операторов raiserror, запускаемых после получения набора результатов (я пишу тесты для хранимых процедур, на случай, если вам интересно, почему я это делаю).

Когда LINQ to SQL вызывает proc и он возвращает набор результатов, он, похоже, игнорирует все ошибки, которые я выбрасываю, потому что он получил свой набор результатов. Есть ли способ заставить его всегда генерировать SqlException, когда я делаю raiserror из SQL?

Ответы [ 2 ]

6 голосов
/ 26 сентября 2009

Интересный; это проблема, с которой я сталкивался ранее при использовании IDataReader, поэтому я теперь религиозно потребляю все таблицы (даже если я ожидаю только одну) - например, если я ожидаю только одну стол, что-то вроде:

    while (reader.Read())
    { // read data from first table

    }
    // read to end of stream
    while (reader.NextResult()) { }

Проблема в том, что ошибка входит в TDS в том месте, где вы ее подняли; так что если вы поднимаете его после SELECT, то в следующей таблице в TDS - и если читатель не читает до конца потока, он может не увидеть его.

Я буду честен - мой предпочтительный ответ на этот вопрос: поднять все ошибки перед данными. Это может означать преобразование основной SELECT в временную таблицу (#table) или переменную таблицы (@table). Кроме того - если критически отловить эту ошибку (и если встроенный код LINQ-to-SQL не помогает), то, возможно, вернитесь к ExecuteReader и что-то подобное выше.

Я подозреваю (но я не проверял), что вы также можете использовать DataContext.Translate<T> для выполнения некоторых тяжелых работ ORM; например:

// cmd is our DbCommand, and ctx is our DataContext
using(var reader = cmd.ExecuteReader()) {
   var result = ctx.Translate<MyResultType>(reader).ToList();
   while(reader.NextResult()) {}
   return result;
}
2 голосов
/ 24 сентября 2009

Убедитесь, что ваш уровень серьезности больше 10, когда вы звоните в RAISERROR согласно:

http://support.microsoft.com/default.aspx/kb/321903

RAISERROR('Stored Procedure Execution Failed',15,1) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...