2017-07-14 5 views
0

Ich bin eine Client-Anwendung erstellt, die alle Werte verschlüsseln und entschlüsseln mit Always Encryption.Einfügen in Tabelle über gespeicherte Prozedur von Client-Anwendung mit immer verschlüsselten AzureKey-Vault

Ich habe Azure Key Vault verwendet, um meine Schlüssel zu speichern. Ich habe this gefolgt. Es funktionierte für mich in Ordnung mit der fest codierten Abfrage (INSERT INTO ....)

Aber wenn ich mit einer gespeicherten Prozedur versuchte, hat es nicht funktioniert. Ich habe bereits auf diese Stack Post verwiesen. Aber die Lösung/Antwort hat meine Probleme leider nicht gelöst. Also habe ich beschlossen, eine neue Frage zu öffnen.

Dies ist mein C# -Code

SqlCommand cmd = _sqlconn.CreateCommand(); 

// Use parameterized SQL to insert the data 
cmd.CommandText = @"INSERT INTO [dbo].[Patients] ([SSN], [FirstName], [LastName], [BirthDate]) VALUES (@SSN, @FirstName, @LastName, @BirthDate);"; 

SqlParameter paramSSN = cmd.CreateParameter(); 
paramSSN.ParameterName = @"@SSN"; 
paramSSN.SqlDbType = SqlDbType.Char; 
paramSSN.DbType = DbType.AnsiStringFixedLength; 
paramSSN.Direction = ParameterDirection.Input; 
paramSSN.Value = ssn; 
paramSSN.Size = 11; 
cmd.Parameters.Add(paramSSN); 

SqlParameter paramFirstName = cmd.CreateParameter(); 
paramFirstName.ParameterName = @"@FirstName"; 
paramFirstName.DbType = DbType.String; 
paramFirstName.Direction = ParameterDirection.Input; 
paramFirstName.Value = firstName; 
paramFirstName.Size = 50; 
cmd.Parameters.Add(paramFirstName); 

SqlParameter paramLastName = cmd.CreateParameter(); 
paramLastName.ParameterName = @"@LastName"; 
paramLastName.DbType = DbType.String; 
paramLastName.Direction = ParameterDirection.Input; 
paramLastName.Value = lastName; 
paramLastName.Size = 50; 
cmd.Parameters.Add(paramLastName); 

SqlParameter paramBirthdate = cmd.CreateParameter(); 
paramBirthdate.ParameterName = @"@BirthDate"; 
paramBirthdate.SqlDbType = SqlDbType.Date; 
paramBirthdate.Direction = ParameterDirection.Input; 
paramBirthdate.Value = birthdate; 
cmd.Parameters.Add(paramBirthdate); 

cmd.ExecuteNonQuery(); 

Als ich für die Verwendung der gespeicherten Prozedur ein wenig verändert. Es wirft Fehler wie

Zusätzliche Informationen: Operand Typ Zusammenstoß: char mit VARCHAR inkompatibel ist (20), verschlüsselt mit (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = ‚TestDB ‚) collation_name = 'SQL_Latin1_General_CP1_CI_AS'

string execute = @"[dbo].[insertsp]"; 

SqlCommand cmd = new SqlCommand(execute, _sqlconn); 
cmd.CommandType = CommandType.StoredProcedure; 

    SqlParameter paramSSN = cmd.CreateParameter(); 
    paramSSN.ParameterName = @"@SSN"; 
    paramSSN.SqlDbType = SqlDbType.Char; 
    paramSSN.DbType = DbType.AnsiStringFixedLength; 
    paramSSN.Direction = ParameterDirection.Input; 
    paramSSN.Value = ssn; 
    paramSSN.Size = 11; 
    cmd.Parameters.Add(paramSSN); 

    SqlParameter paramFirstName = cmd.CreateParameter(); 
    paramFirstName.ParameterName = @"@FirstName"; 
    paramFirstName.DbType = DbType.String; 
    paramFirstName.Direction = ParameterDirection.Input; 
    paramFirstName.Value = firstName; 
    paramFirstName.Size = 50; 
    cmd.Parameters.Add(paramFirstName); 

    SqlParameter paramLastName = cmd.CreateParameter(); 
    paramLastName.ParameterName = @"@LastName"; 
    paramLastName.DbType = DbType.String; 
    paramLastName.Direction = ParameterDirection.Input; 
    paramLastName.Value = lastName; 
    paramLastName.Size = 50; 
    cmd.Parameters.Add(paramLastName); 

    SqlParameter paramBirthdate = cmd.CreateParameter(); 
    paramBirthdate.ParameterName = @"@BirthDate"; 
    paramBirthdate.SqlDbType = SqlDbType.Date; 
    paramBirthdate.Direction = ParameterDirection.Input; 
    paramBirthdate.Value = birthdate; 
    cmd.Parameters.Add(paramBirthdate); 

    cmd.ExecuteNonQuery(); 

das ist mein Schema nach der Verschlüsselung

CREATE TABLE [dbo].[patients] 
(
    [ssn] [varchar](20) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL, 
    [FirstName] [varchar](50) NULL, 
    [LastName] [varchar](50) NULL, 
    [BirthDate] [datetime] NULL 
) 
aktiviert

(PS: Ich habe bereits die Spaltenverschlüsselungseinstellung = aktiviert in meiner Verbindungszeichenfolge aktiviert. Auch versucht mit EXEC sys.sp_refresh_parameter_encryption @name = '[dbo].[sp]' - funktioniert nicht für mich)

Antwort

1

Nur ein Case Sensitive Problem (@ssn und @SSN).

Bitte nicht zu vergessen, dass

SQL ist nicht Case Sensitive

C# CASE SENSITIVE

Verwandte Themen