如何解决使用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 举报,一经查实,本站将立刻删除。