Типы данных nvarchar (max), зашифрованные с помощью (encryption_type = 'DETERMINISTI C' xxx), несовместимы в операторе равенства - PullRequest
0 голосов
/ 19 июня 2020
var countryCode = new SqlParameter("@countryCode", SqlDbType.VarBinary);
var byteArray = Encoding.UTF8.GetBytes(dto.Country);
countryCode.Value = byteArray;
var country = new SqlParameter("@country", "country");
country.Value = "country";

var rawUsers = DbContext.Users.FromSqlRaw("Select u.* from AspNetUsers u join AspNetUserClaims uc on
                                            u.Id = uc.UserId where uc.ClaimType = @country and
                                            uc.ClaimValue = @countryCode", country, countryCode)
                              .ToList();

ОШИБКА:

[17:16:22 ОШИБКА] Ошибка: типы данных nvarchar (max), зашифрованные с помощью (encryption_type = 'DETERMINISTI C', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256 », column_encryption_key_name = 'CEK_WITH_AKV', column_encryption_key_database_name = 'MyDatabase') и VARBINARY (2) зашифровано с (encryption_type = 'DETERMINISTI C', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_WITH_AKV', column_encryption_key_database_name = 'MyDatabase') являются несовместимо в операторе равенства.

Кстати, столбцы db зашифрованы, большинство столбцов nvarchar зашифрованы.

Я искал решения, чтобы исправить это. Но вроде ничего не работает. Я что-нибудь пропустил? Кто может помочь?

1 Ответ

2 голосов
/ 20 июня 2020

AspNetUserClaims.ClaimValue равно nvarchar(max)

@countryCode равно varbinary(2)

AlwaysEncrypted - это шифрование на стороне клиента. Таким образом, зашифрованное значение параметра должно соответствовать точно зашифрованному значению столбца. Следовательно, не может быть неявных преобразований на стороне сервера для сравнения, и типы данных должны точно совпадать.

Таким образом, вам также необходимо объявить параметр как nvarchar(max). Например,

   var countryCode = new SqlParameter("@countryCode", SqlDbType.NVarChar,-1);
   countryCode.Value = dto.Country;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...