3

次のクエリ文字列があります

"SELECT VALUE entity FROM Entities AS entity WHERE entity.Client_id
= 0 && entity.Name LIKE @searchvalue ORDER BY @sorting SKIP @skip LIMIT @limit"

次のパラメータ置換で

query.Parameters.Add(new ObjectParameter("skip", start));
query.Parameters.Add(new ObjectParameter("limit", limit));
query.Parameters.Add(new ObjectParameter("searchvalue", searchValue + "%"));
query.Parameters.Add(new ObjectParameter("sorting", sortField + " " + sortDirection.ToUpper()));

しかし、私は常に例外になります:

キー式 'ORDER BY' には、即時入力スコープへの参照が少なくとも 1 つ必要です。ORDER BY句の近くの項目

query.Parameters.Add(...)これにより、すべてが引用符で囲まれていると思いますか?私もこれを読みましquery.Parameters.Add(...)たが、何も起こらない場合、どのような利益が必要ですか? OK、攻撃者は新しいクエリを開始しないかもしれませんが、現在のクエリを操作できると思いますか?

4

3 に答える 3

3

推測:このようなことをするために最初に試すこと

SELECT VALUE entity FROM Entities AS entity WHERE entity.Client_id = 0 && entity.Name LIKE '@searchvalue' ORDER BY @sorting @sortorder SKIP @skip LIMIT @limit

query.Parameters.Add(new ObjectParameter("searchvalue", searchValue + "%"));
query.Parameters.Add(new ObjectParameter("sorting",   sortField ));
query.Parameters.Add(new ObjectParameter("sortorder", sortDirection));

つまり、ソート順を分離されたパラメーターに移動します。

編集

これが機能しない場合は、クエリ ビルダーを使用してクエリを作成します。

たとえば、ここを見てください。

幸運を。

于 2012-01-31T08:01:31.373 に答える
0

パラメータ化されたクエリIMOを使用しているため、引用符@searchvalueを削除してみましたが、引用符は不要になりました。

それ以外の:

"SELECT VALUE entity FROM Entities AS entity WHERE entity.Client_id
= 0 && entity.Name LIKE '@searchvalue' ORDER BY @sorting SKIP @skip LIMIT @limit"

これを試して:

"SELECT VALUE entity FROM Entities AS entity WHERE entity.Client_id
= 0 && entity.Name LIKE @searchvalue ORDER BY @sorting SKIP @skip LIMIT @limit"
于 2012-01-31T08:15:15.880 に答える
0

列名の代わりにパラメーターを使用することはできません。

于 2012-01-31T09:00:54.303 に答える