В C # ADO.NET, как я могу узнать, что sproc вернул 0 строк, а у sproc не было команд для запуска на TSQL? - PullRequest
0 голосов
/ 07 июня 2011

В C # ADO.NET, как я могу узнать, что sproc возвратил 0 строк, а у sproc нет команд для запуска на TSQL?

Позвольте мне изложить это полностью. В TSQL у меня есть (когда я открываю это в SSMS)

ALTER PROC mySproc 
  @myvar VARCHAR(10)
AS

/* commented out on dev system - uncomment on production */
/* guess what didn't happen */
/* careful readers will note that we _normally_ 
   throw an exception when we do this. this sproc was missing said exception. */

При запуске в SSMS mySproc 'value' это говорит: «Команда (ы) выполнена успешно». В более благоприятных обстоятельствах (то есть просто данные не возвращаются, но тело sproc фактически выполняется), оно вернуло бы то, что выглядело как таблица, но без строк.

и в C #:

using( SqlDataReader reader = cmd.ExecuteReader() ){
  //reader.HasRows == false
}

Итак, это то, с чем я столкнулся, и без использования «отражения SQL» (т.е. чтения реального сценария в базе данных) и без использования ORM (потому что тогда я знал бы, что посылаю правильные команды, но мы имеем наши причины использования sprocs, конечно) ...

Как узнать, что я получил результат "Команда (и) успешно выполнена". вместо потенциальной таблицы без строк?

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Я изначально поместил это в комментарий, но он более уместен в качестве ответа

Вы можете использовать свойство FieldCount в ридере, чтобы определить количество столбцов.Например:

using( SqlDataReader reader = cmd.ExecuteReader() )
{
    if (reader.FieldCount > 0) 
    {
       // there are columns
    } 
    else 
    {
       // there are no columns, so stored proc returning no results set
    }
}

С страница MSDN на FieldCount

Выполнение запроса, который по своей природе не возвращает строки (например,как запрос DELETE), устанавливает FieldCount в 0. Однако.это не следует путать с запросом, который возвращает 0 строк (например, SELECT * FROM table WHERE 1 = 2), и в этом случае FieldCount возвращает количество столбцов в таблице, включая скрытые поля.Используйте VisibleFieldCount для исключения скрытых полей.

1 голос
/ 07 июня 2011

Я бы посоветовал провести аудит SQL Server и вывести из себя дерьма разработчиков, которые фактически создают SPROC без тел.Я не знаю способа определить глупость в SQL Server от читателя, кроме как фактически выполнить аудит, когда нет строк (запустить что-то вроде sp_helptext и определить, есть ли тело?)Трудно защитить от разгильдяйства.Извините!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...