2

我在 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

这在服务器端工作得很好。

但是,在客户端,当我在 a 中将 @id 和 @symkey_password 作为标准参数传递SqlCommand并尝试使用时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”未打开。使用前请打开钥匙。

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

4

0 回答 0