0

データベース モデルを使用しており、.ExecuteStoreQuery関数を使用してデータをクエリしようとしています。

私のSQL文は次のようになります

SELECT * FROM t WHERE f1 LIKE @pr1 AND f2 LIKE @pr2 AND f3 LIKE @pr3

ご覧のとおり、@ pr1,2,3の3つのパラメーターを使用しています

context.ExecuteStoreQuery(SQL_string,
new SqlParameter {
  ParameterName = "pr1",
  Value = filterVal1
},
new SqlParameter {
  ParameterName = "pr2",
  Value = filterVal2
},
new SqlParameter {
  ParameterName = "pr3",
  Value = filterVal3 == 0 ? filterVal3.ToString() : "%"
});

ご覧のとおり、条件に応じて、filterVal3 の実際の値またはワイルドカード % を使用したいので、最終的に SQL ステートメントが実行されると、他の 2 つのパラメーターに基づいてレコードが選択されます。

問題は、「%」が予期していないものに変換され、クエリが空のセットを返すことです。SQL_string 内で @pr3 を '%' に置き換えようとしたところ、実際に必要な結果が得られました。

では、SqlParameter を使用してどのように動作させることができますか?

私が明確だったことを願っています。

4

3 に答える 3

0

アクセスDBで同様の問題が発生しました。解決策は、c#コードで%を*に置き換えることでした。なぜそれが機能したのかわかりません:-/

于 2013-02-12T20:44:41.197 に答える
0

ストアドプロシージャでそれを行うことができます

SELECT * 
FROM t 
WHERE f1 LIKE @pr1 + '%' 
    AND f2 LIKE '%' + @pr2 + '%' --if you want to search this way
    AND f3 LIKE @pr3 + '%'
于 2013-02-12T20:46:04.883 に答える
0

ここで問題になるのは睡眠不足です。

実際に意図したとおりに動作します。SOに尋ねる前に、これをグーグルで2時間近く費やしましたが、ついに目が開きました。

new SqlParameter {
  ParameterName = "pr3",
  Value = filterVal3 == 0 ? filterVal3.ToString() : "%"
});

ここでの継続的なステートメントは間違っています。デバッグ中に の値が 0 になることを期待していましたがfilterVal3、そのような場合、クエリを実行するときに f3 フィールドを「無視」することを考えていましたが、誤って true : false に切り替えてしまい、間違った結果につながりました。

正しいものは次のとおりです。

new SqlParameter {
  ParameterName = "pr3",
  Value = filterVal3 != 0 ? filterVal3.ToString() : "%"
});

時間を無駄にしてごめんなさい:(

于 2013-02-12T21:06:07.457 に答える