使用System.Data.SqlClient传递对称密钥到调用exec sp_executesql

问题描述

我有一个sql Server 2017中受密码保护的对称密钥加密的列。在服务器上,我可以从另一个存储过程中调用sp_foo,如下所示:

declare @symkey_password varchar(50) = 'Where would we be without stackoverflow'
exec sp_foo @id,@symkey_password

sp_foo中,我们有以下内容

 create procedure sp_foo
     @id int,@symkey_password varchar(50)
 as
 begin
     set @openkey = 'open symmetric key MY_SYM_KEY decryption by password = ' + quotename(@symkey_password,'''') + ';'
     exec sp_executesql @openkey;

     select name,convert(varchar(100),decryptbykey(myencryptedcolumn)) as plaintext
     from T 
     where id = @id   

     CLOSE SYMMETRIC KEY MY_SYM_KEY;   
end

那在服务器端很好用。

但是,在客户端,当我在sqlCommand中将@id和@symkey_password作为标准参数传递并尝试使用sqlDataAdapter.Fill时:

string pass = "Where would we be.... etc etc";

var c = new sqlCommand();
c.CommandText = "sp_foo";
c.CommandType = CommandType.StoredProcedure;

c.Parameters.Add(new sqlParameter("@id",12345);
c.Parameters.Add(new sqlParameter("@symkey_password,sqlDbType.VarChar,50);
c.Parameters["@symkey_password"].Value = pass;

var DA = new sqlAdapter(c);

DataTable T;
DA.Fill(T);

有时会出现以下错误

超出了最大存储过程,函数,触发器或视图嵌套级别(限制32)

有时候我得到这个:

未使用指定的解密器对密钥进行加密。密钥“ MY_SYM_KEY”未打开。请在使用前打开钥匙。

当存储过程调用sp_executesql时,在C#中调用存储过程客户端的正确方法是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)