在 decimal(18,2) 上使用 Always Encrypted
Use Always Encrypted on decimal(18,2)
我正在使用新的 SQL Server 2016 功能 - 始终加密。这是非常酷和简单的技术——但不适用于十进制类型。
当我插入一个值时,我收到类似这样的错误(ZP_Test
- 我的数据库名称):
Operand type clash: decimal(4,2) encrypted 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') is incompatible with decimal(18,2) encrypted 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')
Statement(s) could not be prepared.
我的API是用C#写的,请看我的代码,也许你知道解决办法。
SQL 查询创建 table
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();
Trace in 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)'
请使用 SqlParamater 对象指定小数的精度和小数位数,如下所示
SqlParameter param = new SqlParameter("@amount", SqlDbType.Decimal);
param.Precision = 18;
param.Scale = 2;
command.Parameters.Add(param);
我正在使用新的 SQL Server 2016 功能 - 始终加密。这是非常酷和简单的技术——但不适用于十进制类型。
当我插入一个值时,我收到类似这样的错误(ZP_Test
- 我的数据库名称):
Operand type clash: decimal(4,2) encrypted 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') is incompatible with decimal(18,2) encrypted 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')
Statement(s) could not be prepared.
我的API是用C#写的,请看我的代码,也许你知道解决办法。
SQL 查询创建 table
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();
Trace in 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)'
请使用 SqlParamater 对象指定小数的精度和小数位数,如下所示
SqlParameter param = new SqlParameter("@amount", SqlDbType.Decimal);
param.Precision = 18;
param.Scale = 2;
command.Parameters.Add(param);