0

このコードで問題が発生しました:

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でクエリをコピーすると、両方の方法で機能します。運良く問題を解決できましたが、なぜ機能するのかわかりません。何かご意見は?

4

2 に答える 2

0

私も同じ問題に直面していましたが、列に TRIM を使用するヒントは私の一日を救いました。ずっと探していたのですが、よくわかりませんでした。

それに伴い、以下の変更も行うことで問題を解決できました。

クエリのwhere句で使用される列の一部にCHARデータ型を使用していました。これにより、NHibernate からデータを取得する際に問題が発生していました。その列のデータ型を CHAR から VARCHAR2 に変更し、実際のサイズでデータを更新し、Where 句から TRIM を削除しました。TRICK WORKED!!!! :)

したがって、この種の問題に直面する人は、最初に CHAR の列があるかどうかを確認してから、VARCHAR2 に変更してください。

ただし、もう 1 つ覚えておく必要があるのは、ASP.Net 開発サーバーからアプリケーションを実行している場合は、アプリケーションを閉じて、アプリケーションを再実行することです。Asp.Net開発サーバーを開いて、Oracle接続で更新されないデータ型に変更を加えた場合。したがって、ASP.Net 開発サーバーを閉じてから、アプリケーションを再実行することをお勧めします。

私のポイントが将来誰かに役立つことを願っています!!

よろしく、

スリー・ハルシャヴァルダナ

于 2012-07-04T14:22:06.637 に答える
-4

SQL パラメータで SQL ストアド プロシージャを使用する場合は、SQL クエリでパラメータを使用していません。

于 2012-06-20T00:14:30.273 に答える