2017-08-18 5 views
1

J'utilise une nouvelle fonctionnalité SQL Server 2016 - Toujours cryptée. C'est une technologie très cool et simple - mais pas pour le type décimal.Utilisez Toujours crypté au format décimal (18,2)

Lorsque j'insère une valeur, je reçois des erreurs comme celui-ci (ZP_Test - mon nom DB):

choc de type Opérande: Décimal (4,2) crypté avec (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') est incompatible avec décimal (18,2) chiffrée avec (encryption_type = 'randomisées', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'ColomnKey', column_encryption_key_database_name = 'ZP_Test')
Déclaration (s) impossible (s) à préparer.

Mon API est écrite en C#, veuillez voir mon code peut-être connaissez-vous la solution.

requête SQL pour créer la 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 

exemple de code 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 dans SQL, lorsqu'une erreur se produit -

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

Répondre

0

S'il vous plaît spécifier la précision et l'échelle de la décimale en utilisant l'objet SqlParamater comme suit

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