このコードで問題が発生しました:
string sql = "select distinct ruoli.c_tip_usr"
+ " from vneczx_ute_app_trn ruoli"
+ " join vnecyd_ent_prf ind"
+ " on ruoli.c_ent = ind.c_ent"
+ " where ruoli.c_app = :appCode"
+ " and ruoli.c_ute_mat = :matricola"
+ " and ind.t_des_ent = :indirizzo";
var ruoli = session.CreateSQLQuery(sql)
.SetString("appCode", Config.Configurator.Istance.ApplicationCode)
.SetString("matricola", user.Matricola)
.SetString("indirizzo", indirizzoCasella)
.List<string>();
このコードは正しく実行され、ログに記録されたクエリは正しく、渡されたパラメーターは正しく評価されています...しかし、結果はまったく返されません。デバッグ コンソールからクエリをコピーし、Oracle クライアント アプリケーション (SQL Developer) で直接実行すると、2 つの結果が得られます (正しいと思われる結果)。
問題は最後のパラメータにあり、特別な文字(は電子メール アドレス) がindirizzo
含まれているという事実に依存する必要があることがわかりました。@
indirizzo
だから私はこのソリューションを使用することになりました:
string sql = "select distinct ruoli.c_tip_usr"
+ " from vneczx_ute_app_trn ruoli"
+ " join vnecyd_ent_prf ind"
+ " on ruoli.c_ent = ind.c_ent"
+ " where ruoli.c_app = :appCode"
+ " and ruoli.c_ute_mat = :matricola"
+ " and ind.t_des_ent = '" + indirizzoCasella + "'";
var ruoli = session.CreateSQLQuery(sql)
.SetString("appCode", Config.Configurator.Istance.ApplicationCode)
.SetString("matricola", user.Matricola)
.List<string>();
しかし、それは私にスリルを与えます!クエリのパラメーターは、この状況を具体的に処理することになっているので、特別な文字などを使用して状況を処理することはできませんか? ここで、パラメトリック クエリよりも文字列連結の方がうまく機能するのはなぜですか? NHibernate エンジンに特別な文字を強制的にエスケープさせる方法はありませんか?
アップデート:
この特定の問題を解決する方法を見つけましたtrim
。問題を提起したフィールドでコマンドを使用すると、問題は消えます。したがって、私のSQL文字列の最後の行は次のとおりです。
+ " and trim(ind.t_des_ent) = :indirizzo";
なぜそれが問題の思考を解決するのか理解できません。フィールドでも変数にも空の文字が含まれておらず、SQL Developerでクエリをコピーすると、両方の方法で機能します。運良く問題を解決できましたが、なぜ機能するのかわかりません。何かご意見は?