2013-07-25 9 views
6

.SqlQuery(string sql)コマンドでEFを使用してSQLを実行しています。C#は、Entity Frameworkを使用して実行するSQL文字列を安全に構築します。

私のSQL文字列が完全に消されていることを確認したいので、論理的なアプローチは、パラメータを持つSqlCommandオブジェクトを使用して構築することでした。

SqlCommandを使用して実行する必要はありませんが、SqlCommandにEF .SqlQuery(...)コールに接続できる文字列を吐き出したいだけです。

これを行う方法、または.SqlQueryが注射にならないようにする別の方法がありますか?

答えて

12

EFはそれをすぐにサポートしていますか?

それがないだけSqlCommandのように、などのSQLインジェクションの世話をするようにするには、パラメータでSqlQueryを呼び出すことができる必要があります:

var tests = context.Database.SqlQuery<Test>(
    @"SELECT Id, Name FROM tests where Name={0}", "TestName"); 

か...

var tests = context.Database.SqlQuery<Test>(
    @"SELECT Id, Name FROM tests where [email protected]", 
    new SqlParameter("@name", "TestName")); 
+0

Facepalm。そうです! – NibblyPig

+0

私はこれを動作させることはできません。私は上記の両方の方法を試してみましたが、 "テーブル変数" @name "を宣言する必要があります。エラーが発生しました。 – NibblyPig

+0

パラメータとしてテーブル名を渡そうとしていますか? [参照してください。](http://stackoverflow.com/questions/14003241/must-declare-the-table-variable-table)本当にテーブル名を変数にする必要がありますか? –

0

SqlCommandのCommandTextプロパティを取得します。

+0

があることを試してみましたが、コマンド・テキストは私の元の文字列を返すだけです - パラメータをそれに入れません:例えば 'SELECT * FROM @テーブル名WHERE @propertyName = @ searchQuery' – NibblyPig

+0

Re:編集 - それは単純にstringbuilder ? - ちょうどそれを試して、それはです。それは衛生的なものではない。 – NibblyPig

+0

私はSqlCommandオブジェクトがあなたを守ると信じていますが(間違っているかもしれません)。 –

関連する問題