操作数类型冲突:varchar 与尝试插入加密数据库的 varchar(50) 不兼容

问题描述 投票:0回答:4

我得到了

SqlException

操作数类型冲突:varchar 与加密的 varchar(50) 不兼容 与(加密类型='确定性',加密算法名称= 'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name = 'CEK_Auto1',column_encryption_key_database_name = 'PB') 排序规则名称 = '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/

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

c# asp.net sql-server encryption always-encrypted
4个回答
5
投票

有 2 件事你可以尝试,

确保在连接字符串中启用列加密设置。这可以使用

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]'

5
投票

如果有人仍在寻找此问题的答案,对我有用的是您需要在 SqlParameter 数据类型中使用

DbType.AnsiStringFixedLength
数据类型来加密列。

请参阅本文了解更多信息


0
投票

任何仍然面临实体框架问题的人,您可能需要在实体映射中定义具有数据库类型和长度的属性,该属性继承自

EntityTypeConfiguration

  this.Property(t => t.FieldName).HasColumnType("varchar").HasMaxLength(50);


-2
投票

任何仍然面临此问题并且上述检查都没有帮助的人,请确保过程和代码中的参数名称完全匹配(区分大小写)。

© www.soinside.com 2019 - 2024. All rights reserved.