操作数类型冲突: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’)collat​​ion_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]'