Это будет возвращать 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
}
}
Вы не можете получить данные с помощью 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.
Боковые заметки: