4

我得到一个SqlException

操作数类型冲突:varchar 与使用 (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') 加密的 varchar(50) 不兼容 collat​​ion_name = 'SQL_Latin1_General_CP1_CI_AS'\不正确的参数加密从客户端收到元数据。在调用批处理期间发生错误,因此客户端可以通过调用 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/

我的问题很相似,但我还没有找到解决方案。

4

3 回答 3

5

你可以尝试两件事,

确保在您的连接字符串中启用了列加密设置。这可以使用一个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]'
于 2016-12-09T19:05:06.553 回答
4

如果有人仍在寻找这个问题的答案,那么对我有用的是您需要使用DbType.AnsiStringFixedLengthSqlParameter 数据类型中的数据类型来加密列。

参考这篇文章了解更多信息

于 2019-05-17T10:36:53.070 回答
-2

任何仍然面临此问题且上述检查均无济于事的人,请确保过程和代码中的参数名称完全匹配(区分大小写)。

于 2020-08-31T17:11:52.967 回答