Хранимая процедура CLR

#clr #clrstoredprocedure

#clr #clrstoredprocedure

Вопрос:

Я хочу использовать криптографический API в хранимой процедуре CLR.

Я создал хранимую процедуру CLR и написал инструкцию select

 SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Context Connection=true";
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = @"select * from Employee";

SqlDataReader rdr = cmd.ExecuteReader();
  

Теперь я хочу отфильтровать результаты, используя номер сотрудника, который хранится в зашифрованном виде в базе данных, для которой я собираюсь использовать методы криптографии.

Теперь я застрял в том, как фильтровать записи из SqlDataReader .

Я хочу формат возврата как SqlDataReader , поскольку для возврата нескольких записей из хранимой процедуры CLR существует один метод, SqlContext.Pipe.Send() и этот метод принимает только SqlDataReader объекты.

Пожалуйста, направьте меня.

Ответ №1:

Я рассматриваю аналогичную проблему, когда я хочу выполнить некоторые манипуляции, прежде чем возвращать результаты. Единственный способ, который я вижу на данный момент, — это использовать:

 // Note you need to pass an array of SqlMetaData objects to represent your columns
// to the constructor of SqlDataRecord

SqlDataRecord record = new SqlDataRecord();

// Use the Set methods on record to supply the values for the first row of data
SqlContext.Pipe.SendResultsStart(record);

// for each record you want to return
// use set methods on record to populate this row of data

SqlContext.Pipe.SendResultsRow(record);
  

Затем вызовите SqlContext.Pipe.SendResultsEnd , когда закончите.

Если есть лучший способ, я бы тоже хотел знать!

Комментарии:

1. Вместо фильтрации записей после выполнения команды я пишу функцию CLR, которая выполняла бы расшифровку за меня. Я бы использовал эту функцию CLR в своем операторе where. Следовательно, я получал бы отфильтрованные записи, которые я мог бы отправлять напрямую.