Mul*_*ova 4 c# sql-server asp.net encryption always-encrypted
我得到一个SqlException
:
操作数类型冲突:varchar 与使用加密的 varchar(50) 不兼容 (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_name_1L_General encryption_property_key_database_1Latinr_Inc.从客户端收到元数据。该错误发生在批处理调用期间,因此客户端可以通过调用 sp_describe_parameter_encryption 刷新参数加密元数据并重试。
我的 C# 代码:
using (var connection = new SqlConnection(GetConnectionString()))
{
using (var cmd = new SqlCommand("Clients_Insert", connection))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Email", SqlDbType.VarChar, 50).Value = client.Email;
cmd.Parameters.Add("@ContactPerson", SqlDbType.VarChar, 400).Value = client.ContactPerson;
connection.Open();
cmd.ExecuteNonQuery();
}
}
Run Code Online (Sandbox Code Playgroud)
还有我的存储过程:
ALTER PROCEDURE [dbo].[Clients_Insert]
@Email VARCHAR(50),
@ContactPerson VARCHAR(400)
AS
BEGIN
INSERT into dbo.Clients(Email, ContactPerson)
VALUES (@Email, @ContactPerson);
SELECT SCOPE_IDENTITY();
END;
Run Code Online (Sandbox Code Playgroud)
我将数据插入未加密的字段没有问题。
我找到了这篇文章
http://dataap.org/sql-2016-ctp/column-level-encryption-using-always-encrypted-in-sql-server-2016/
我的问题是类似的,但我还没有找到解决方案。
有2件事你可以尝试,
确保在您的连接字符串中启用了列加密设置。这可以用做SqlConnectionStringBuilder
对象,并设置SqlConnectionStringBuilder.ColumnEncryptionSetting
到Enabled
如下
strbldr.ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled;
Run Code Online (Sandbox Code Playgroud)
如果您的存储过程是在加密列之前创建的,则需要按如下方式刷新存储过程的元数据
Use [Database]
GO
--Do this for all stored procedures
EXEC sys.sp_refresh_parameter_encryption @name = '[dbo].[Clients_Insert]'
Run Code Online (Sandbox Code Playgroud)
如果有人仍在寻找此问题的答案,对我有用的是您需要使用DbType.AnsiStringFixedLength
SqlParameter 数据类型中的数据类型来表示加密列。
归档时间: |
|
查看次数: |
17335 次 |
最近记录: |