问题描述
我有一个用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 (将#修改为@)