Вернуть набор записей из сборки SQL CLR? - PullRequest
1 голос
/ 20 сентября 2009

Ребята, помогите мне, думаю, я близок, но что-то упускаю.

Фон

Я переписываю сборку SQL CLR (хранимая процедура), моя сборка связывается с другим ресурсом и возвращает XML. Я хочу вернуть этот XML как набор записей, а НЕ скалярное значение.

Из того, что я видел, вот как вернуть набор записей:

SqlContext.Pipe.Send(mySqlDataReader)

Метод Send принимает 3 возможных параметра:

public void Send(string message);
public void Send(SqlDataRecord record);
public void Send(SqlDataReader reader);

Класс SqlDataReader не имеет конструктора, как SqlCommand.ExecuteReader () возвращает его?

Что мне нужно сделать

  • Создать свой собственный класс, наследующий от IDataReader .
  • Заставить этот класс использовать XML и представить его как записи (например, DataReader).
  • Переопределите SqlDataReader и передайте его в SqlContext.Pipe.Send (mySqlDataReader). ???

Вот тут-то и нечетко.

Как вернуть свой пользовательский набор записей обратно на SQL Server?

Ответы [ 2 ]

3 голосов
/ 20 сентября 2009

Полагаю, вам лучше использовать SqlDataRecord. Вы можете увидеть описание здесь

Это должно выглядеть следующим образом:

 SqlDataRecord record = new SqlDataRecord(new SqlMetaData[] { new SqlMetaData("Column1", SqlDbType.NVarChar)});

 // Set the record fields.
 record.SetString(0, youVariableWithXmlData);

 // Send the data
 SqlContext.Pipe.Send(record);
0 голосов
/ 04 сентября 2015

Во-первых: сборки ничего не возвращают, они просто содержат один или несколько методов, которые могут возвращать наборы результатов, скалярные значения, возвращаемые значения.

Если у вас уже есть SqlDataReader (это не ясно из формулировки Вопроса), то вы были очень близки с возвращением набора результатов.

Класс SqlDataReader не имеет конструктора. Как SqlCommand.ExecuteReader () возвращает его?

Как метод ExecuteReader создает SqlDataReader не важно. важно , важно то, что возвращает и возвращает SqlDataReader. Следовательно, вам просто нужно сделать следующее:

SqlDataReader _Reader = SqlCommand.ExecuteReader();
SqlContext.Pipe.Send(_Reader);
// be sure to call .Dispose() on the SqlDataReader, SqlCommand, and SqlConnection objects,
// if they are not each in their own using() blocks

Этот метод довольно эффективен, но не позволяет вам перехватывать строки SqlDataReader перед передачей их обратно как строк набора результатов. Поэтому, если вам нужно манипулировать значениями перед отправкой их обратно вызывающей стороне, используйте следующие методы: SqlContext.Pipe:

  • SendResultsStart(SqlDataRecord)
  • SendResultsRow(SqlDataRecord)
  • SendResultsEnd()
...