在十进制上使用始终加密(18,2)

时间:2017-08-18 03:34:55

标签: sql-server encryption sql-server-2016 always-encrypted

我正在使用新的SQL Server 2016功能 - 始终加密。这是非常酷和简单的技术 - 但不是十进制类型。

当我插入一个值时,我收到类似这样的错误(ZP_Test - 我的数据库名称):

  

操作数类型冲突:十进制(4,2)加密(encryption_type ='RANDOMIZED',encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name ='ColomnKey',column_encryption_key_database_name ='ZP_Test')与十进制(18,2)加密不兼容with(encryption_type ='RANDOMIZED',encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name ='ColomnKey',column_encryption_key_database_name ='ZP_Test')
  声明无法准备。

我的API是用C#编写的,请查看我的代码,也许您知道解决方案。

用于创建表的SQL查询

CREATE TABLE [dbo].[EmpInfo]
(
    [EmpID] [int] NULL,
    [NatID] [nvarchar](max) COLLATE Cyrillic_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [ColomnKey], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
    [Amount] [decimal](18, 2) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [ColomnKey], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL
) ON [PRIMARY]
GO

C#代码示例

command.CommandText = "INSERT INTO EmpInfo(EmpID, NatID, Amount) VALUES (@key, @ssn, @amount)";

command.Parameters.AddWithValue("@key", key);
command.Parameters.AddWithValue("@ssn", DBNull.Value);
command.Parameters.AddWithValue("@amount", Convert.ToDecimal("11.00"));
command.ExecuteNonQuery();

在发生错误时在SQL中跟踪 -

exec sp_describe_parameter_encryption N'INSERT INTO EmpInfo(EmpID, NatID, Amount, AmountDec) VALUES (@key, @ssn, @amount, @amountDec)',N'@key int,@ssn nvarchar(7),@amount decimal(4,2)'

1 个答案:

答案 0 :(得分:0)

请使用SqlParamater对象指定小数的精度和比例,如下所示

SqlParameter param = new SqlParameter("@amount", SqlDbType.Decimal);
param.Precision = 18;
param.Scale = 2;
command.Parameters.Add(param);