Хранимая процедура CLR возвращает SqlDataReader, но тип метода void

1

Это будет возвращать datareader, но тип метода недействителен. Как получить значение SqlDataReader из метода для его изменения на бизнес-уровне?

    [SqlProcedure]
    public static void GetStates() // Method
    {
        using (SqlConnection connection = new SqlConnection("context connection=true"))
        {
            StringBuilder StateQuery = new StringBuilder();
            StateQuery.Append("SELECT OID,Name ");
            StateQuery.Append("FROM ");
            StateQuery.Append("State");
            connection.Open();
            SqlCommand command = new SqlCommand(StateQuery.ToString(), connection);
            SqlContext.Pipe.ExecuteAndSend(command); //Return
       }
   }
  • 0
    Изменить тип возврата метода и вернуть читателя?
  • 2
    Хранимая процедура CLR должна иметь тип возврата void
Показать ещё 2 комментария
Теги:
sqlclr

1 ответ

0
Лучший ответ

Вы не можете получить данные с помощью ExecuteAndSend(). Чтобы вернуть данные в приложение, вам нужно открыть SqlConnection, создать SqlCommand, используя этот SqlConnection, и вызвать SqlCommand.ExecuteReader или SqlCommand.ExecuteScalar.

С другой стороны, вопрос неоднозначен. Причиной создания хранимой процедуры CLR является выполнение этой CLR в качестве хранимой процедуры. В этом смысле он не будет отправлять какие-либо данные на уровень приложения, поскольку он вызывается T-SQL, а не уровнем приложения.

При этом, поскольку целью здесь является просто выполнить запрос SELECT OID, Name FROM State, нет абсолютно никаких оснований для этого с помощью SQLCLR. Просто выполните обычный SqlCommand на уровне приложения, чтобы либо запустить этот простой запрос, либо выполнить обычный T-SQL-процесс, который инкапсулирует этот запрос. В любом случае вы получите набор результатов, чтобы вызвать SqlCommand.ExecuteReader(), чтобы получить эти результаты. Эта операция является очень прямым SELECT из БД и не должна быть чрезмерно сложной с помощью SQLCLR.

Боковые заметки:

  • Тип возврата хранимой процедуры CLR не должен быть недействительным. Процедуры, T-SQL и CLR, могут возвращать тип INT/Int32.
  • SqlContext.Pipe используется в основном для отправки информации (запросы для выполнения, результаты для отображения как часть набора результатов или сообщения [, отображаемые на вкладке "Сообщения" в SSMS]).
  • 0
    Если я хочу вернуть DataReader / DataTable. Тогда как это сделать?
  • 0
    @ Кумар, верните DataReader / DataTable куда именно?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню