#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. Следовательно, я получал бы отфильтрованные записи, которые я мог бы отправлять напрямую.