私は対称キー暗号化カラムを追加したSQL Serverバックエンドと通信するためにVB.Netを使用しています。WHERE句(VB.Netフロントエンド)のDecryptByKeyを使用したSQLパラメータ化クエリ
DecryptByKeyを使わずにこのテーブルでクエリを実行すると、キーの開閉がないため、正常に動作します。私がWHERE句に追加すると、それはおそらく鍵の開閉に関係していると思うが、それは爆弾だ。ここを見ていくつかのコード... @unencryptedValueがあり、それは上記顕著でなかった場合
OPEN SYMMETRIC KEY TestKey
DECRYPTION BY CERTIFICATE TestCertificate;
GO
SELECT 1
FROM TestTable
WHERE CONVERT(varchar, DecryptByKey(encryptedField)) = @unencryptedValue
CLOSE SYMMETRIC KEY TestKey;
GO
を送られているSQL Serverの
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コードを呼び出す
VB.Netのコードです"12345"の値を持つvarchar(50)
2つのエラーが返され、System.Data.SqlClient.SqlException:「GO」付近の構文が正しくありません
このクエリをSSMSクエリウィンドウで直接実行すると正常に動作します。
私はGOがそれ自身の行でなければならないことを知っています。そのため、_SQLに入る文字列を作成するときに、ChrW(13)& ChrW(10)をその前後に挿入します。
また、私はDecryptByKeyを実行するのが遅いと思いますが、おそらく良い考えではありませんが、テーブルは小さくても問題にならないはずです。
GOは、SQL Server Management StudioのIDEによってのみ理解されます。複数のコマンドテキストを送信したい場合は、それらをセミコロンで区切ります – Steve