2017-11-14 27 views
2

私は対称キー暗号化カラムを追加した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を実行するのが遅いと思いますが、おそらく良い考えではありませんが、テーブルは小さくても問題にならないはずです。

+3

GOは、SQL Server Management StudioのIDEによってのみ理解されます。複数のコマンドテキストを送信したい場合は、それらをセミコロンで区切ります – Steve

答えて

0

GOはSQL言語の一部ではありません。 Management Studioのようなツールで使用されるバッチ区切り記号ですが、Sql Server自体が理解できるものではありません。

代わりに、個々のステートメントをセミコロンで区切ることができます(または改行だけでも)し、別々のデータベース(別々のExecuteNonQuery/ExecuteScalar/ExecuteDataReader/Fill関数呼び出し)を送信してバッチを区切ります。

関連する問題