操作数类型冲突:varchar与尝试插入加密数据库的varchar(50)不兼容
我收到一个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_database_name =’PB’)collation_name =’SQL_Latin1_General_CP1_CI_AS’\ r \ n无正确的参数加密从客户端收到元数据。 在调用批处理期间发生错误,因此客户端可以通过调用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(); } }
和我的存储过程:
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;
将数据插入非加密字段时没有问题。
我找到了这篇文章
http://dataap.org/sql-2016-ctp/column-level-encryption-using-always-encrypted-in-sql-server-2016/
我的问题很相似,但我没有找到解决方案。
你可以尝试两件事,
确保在连接字符串中启用了列加密设置。 这可以使用SqlConnectionStringBuilder
对象并将SqlConnectionStringBuilder.ColumnEncryptionSetting
设置为Enabled
,如下所示
strbldr.ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled;
如果在加密列之前创建了存储过程,则需要刷新存储过程的元数据,如下所示
Use [Database] GO --Do this for all stored procedures EXEC sys.sp_refresh_parameter_encryption @name = '[dbo].[Clients_Insert]'