WHERE子句中使用DecryptByKey的SQL参数化查询(VB.Net前端)

时间:2017-11-14 21:30:53

标签: sql sql-server vb.net

我正在使用VB.Net与我的SQL Server后端进行通信,我刚刚添加了一个Symmetric Key加密列。

当我在没有DecryptByKey的情况下对此表进行查询,因此没有打开/关闭Key时,它可以正常工作。一旦我将它添加到WHERE子句中,它就会发生轰炸,尽管我的想法可能与Key的打开/关闭有关。这里有一些代码可以看......

调用SQL Server的VB.Net代码

Dim _cn As New SqlClient.SqlConnection
Dim _dataset As New DataSet
Dim _dataapt As New SqlClient.SqlDataAdapter
Dim _command As New SqlClient.SqlCommand

_cn.ConnectionString = "fake connection string"
_cn.Open()

_command.CommandText = _SQL

If Not _parameters Is Nothing Then
    For _x As Integer = 0 To _parameters.Count - 1
        _command.Parameters.Add(_parameters(_x)._parameter, _parameters(_x)._type).Value = _parameters(_x)._value
        // _parameter = "@unencryptedValue", _type = SQLDbType.VarChar, _value = "12345"
    Next
End If

_command.CommandTimeout = 600
_command.Connection = _cn

If _cn.State = ConnectionState.Closed Then
    _cn.Open()
End If

_dataapt.SelectCommand = _command
_dataapt.Fill(_dataset)

_dataapt.Dispose()
_command.Dispose()
_cn.Close()
_cn.Dispose()

正在发送的SQL代码

OPEN SYMMETRIC KEY TestKey 
DECRYPTION BY CERTIFICATE TestCertificate;
GO
SELECT 1  
FROM TestTable
WHERE CONVERT(varchar, DecryptByKey(encryptedField)) = @unencryptedValue
CLOSE SYMMETRIC KEY TestKey;
GO

如果上面没有注意到,@unencryptedValue是一个varchar(50),其值为“12345”

我收到2个错误,都说System.Data.SqlClient.SqlException:'GO'附近的语法不正确

当我直接在SSMS查询窗口中运行此查询时,它可以正常工作。

我知道GO必须在它自己的行上,所以当我创建进入_SQL的字符串时,我放了ChrW(13)&每次之前和之后的ChrW(10)。

另外,我知道在WHERE中做DecryptByKey很慢并且可能不是一个好主意,但是表格会保持很小,所以这不应该是个问题。

1 个答案:

答案 0 :(得分:0)

GO不是SQL语言的一部分。它是Management Studio等工具使用的批处理分隔符,但它并不是Sql Server本身所理解的。

相反,您可以使用分号(或者通常只使用换行符)分隔单个语句,并通过向数据库发送单独的调用来分隔批处理(不同的ExecuteNonQuery / ExecuteScalar / ExecuteDataReader / Fill函数调用)。 / p>