微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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