2016-10-26 170 views
2

我得到一个SqlException插入不兼容:操作数类型冲突:VARCHAR是VARCHAR(50)试图加密数据库

操作数类型冲突: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 \ nIncorrect参数 加密的元数据是从所述客户端接收。调用批处理期间发生错误 ,因此客户端可以通过调用 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/

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

回答

0

有两件东西你可以尝试,

确保您的连接字符串中启用列加密设置。这可以使用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]' 
+0

比你的答案..我找到了解决方案..由于某种原因,我应该插入字段的最大长度,所以当我试图插入长度为12的东西到我的领域是类型varchar(50)我得到错误..我只填写了50个符号与空格.. –

+0

嗨穆拉纳莫诺瓦,最多可以填写50个符号,如果您可以发布更新的代码,存储特效和架构,我可能会提供帮助。 –

+0

如果我尝试通过不使用存储过程插入数据会怎样?因为目前我面临同样的问题。 –

相关问题