我正在使用VB.Net与我的SQL Server后端进行通信,我刚刚在其中添加了对称密钥加密列。
当我在没有DecryptByKey的情况下对此表进行查询时,因此没有打开/关闭密钥,它可以正常工作。一旦我将其添加到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”
我收到两个错误,都说System.Data.SqlClient.SqlException:'GO'附近的语法不正确
当我直接在SSMS查询窗口中运行此查询时,它工作正常。
我知道GO必须位于自己的行上,因此当我创建用于_SQL的字符串时,每次都在其前后放置ChrW(13)和ChrW(10)。
另外,我知道在WHERE中执行DecryptByKey速度很慢,可能不是一个好主意,但是表将保持很小,因此这不是问题。
GO
不是SQL语言的一部分。它是Management Studio等工具使用的批处理分隔符,但Sql Server本身并不了解。
取而代之的是,您可以使用分号分隔单个语句(或者甚至仅使用换行符),并通过向数据库发送单独的调用(与众不同的ExecuteNonQuery / ExecuteScalar / ExecuteDataReader / Fill函数调用)来分隔批处理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句