【问题标题】:Operand type clash: varchar is incompatible with varchar(50) trying to insert in encrypted database操作数类型冲突:varchar 与尝试插入加密数据库的 varchar(50) 不兼容
【发布时间】:2017-03-09 01:39:28
【问题描述】:

我收到了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/

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

【问题讨论】:

  • 你解决过这个问题吗?

标签: c# asp.net sql-server encryption always-encrypted


【解决方案1】:

您可以尝试 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]'

【讨论】:

  • 谢谢你的回答..我找到了一个解决方案..出于某种原因,我应该插入具有最大长度的字段,所以当我尝试在我的字段中插入长度为 12 的内容时,类型为 varchar (50) 我得到一个错误.. 我最多只能用空格填充 50 个符号..
  • 嗨,Mulana Monova,不需要填写多达 50 个符号,如果您可以发布更新后的代码、存储过程和架构,我可能会提供帮助。
  • 不使用存储过程插入数据怎么办?因为目前我面临同样的问题。
  • @Mr.K 在连接字符串中设置Column Encryption Setting=enabled,如here所述
【解决方案2】:

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

Refer this article for more information

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      相关资源
      最近更新 更多