【问题标题】:SQL Parameterized Query with DecryptByKey in WHERE clause (VB.Net front end)在 WHERE 子句中使用 DecryptByKey 的 SQL 参数化查询(VB.Net 前端)
【发布时间】:2017-11-14 21:30:53
【问题描述】:

我正在使用 VB.Net 与我刚刚添加了对称密钥加密列的 SQL Server 后端进行通信。

当我在没有 DecryptByKey 的情况下对该表进行查询时,因此没有打开/关闭密钥,它工作正常。一旦我将它添加到 WHERE 子句中,它就会爆炸,尽管我认为这可能与钥匙的打开/关闭有关。这是一些要查看的代码...

调用 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 是一个值为“12345”的 varchar(50)

我收到 2 个错误,都说 System.Data.SqlClient.SqlException: Incorrect syntax near 'GO'

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

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

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

【问题讨论】:

  • GO 只有 Sql Server Management Studio 的 IDE 才能理解。如果您想发送多个命令文本,请用分号分隔它们

标签: sql sql-server vb.net


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多