【发布时间】:2019-08-31 19:06:41
【问题描述】:
我正在尝试从我的应用程序中传递一个参数以在存储过程中进行搜索。我这样传入参数:
SqlParameter param1 = new SqlParameter(@"@FilterCustomerPO", "G06756");
param1.DbType = DbType.AnsiString;
param1.Direction = ParameterDirection.Input;
param1.Size = 50;
sqlCmd.Parameters.Add(param1);
在存储过程中是这样定义的:
ALTER PROCEDURE [dbo].[usp_POListing]
@FilterCustomerPO VARCHAR (50)
AS
BEGIN
SELECT *
FROM [Order]
WHERE PONumber = @FilterCustomerPO
END
PONumber 列使用DETERMINISTIC 加密类型加密。
当我传入一个值时,我得到一个错误:
操作数类型冲突:varchar 与使用 (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'ColumnEncryptionKey', column_encryption_key_database_name = 'DataPortal') 加密的 varchar(50) 不兼容>
我看到很多其他人对此进行了报告,但这些解决方案都不适合我。如您所见,我正在使用参数化查询,因此不确定我可能会丢失什么。
编辑:
我也尝试过以这种方式传递参数 - 同样的错误:
sqlCmd.Parameters.Add("FilterCustomerPO", SqlDbType.VarChar, 50);
sqlCmd.Parameters["FilterCustomerPO"].Value = "G06756"
订单表的定义如下:
CREATE TABLE [dbo].[Order]
(
[OrderID] [INT] IDENTITY(1,1) NOT NULL,
[CustomerID] [INT] NOT NULL,
[OrderNumber] [INT] NOT NULL,
[DBCOrderNumber] [VARCHAR](25) NOT NULL,
[PONumber] [VARCHAR](50) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [ColumnEncryptionKey], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
[BillingName] [VARCHAR](255) NOT NULL,
CONSTRAINT [PK_Order]
PRIMARY KEY CLUSTERED ([OrderID] ASC)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
我的客户端连接字符串还包括Column Encryption Setting=Enabled
请注意:我能够很好地检索数据。当我将参数发送到查询中,并在收到错误时尝试进行比较/过滤。
【问题讨论】:
-
提供表
[Order]定义和你的客户端连接属性 -
I've seen a lot of other people reporting on this, but none of those solutions worked for me.- 哪些? stackoverflow.com/a/41067249/11683? stackoverflow.com/a/56184691/11683? -
他们都提到要更改参数类型
DbType.AnsiStringFixedLength- 我试过了,同样的错误。 -
我也跑过
sys.sp_refresh_parameter_encryption,没有骰子:(
标签: sql sql-server azure azure-sql-database always-encrypted