我遇到了这段代码的问题:
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
是一个电子邮件地址)。< / p>
所以我最终使用了这个解决方案:
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>();
但它给了我惊险刺激! Aren查询中的参数应该专门处理这种情况,从而用特殊的char来处理自己的情况,等等? 为什么这里的字符串连接比参数查询效果更好? 难道没有办法强制NHibernate引擎逃脱一些特殊的char?
更新
我发现了如何解决这个特殊问题:在提出问题的字段上使用trim
命令,问题就消失了。
所以我的sql字符串的最后一行现在是:
+ " and trim(ind.t_des_ent) = :indirizzo";
我无法理解它解决问题的原因。不是字段,也不是变量包含空字符,并且SQL Developer上的复制查询都以两种方式工作。 所以我们有一些运气来解决这个问题,但我们不知道为什么它现在有效呢? 有什么想法吗?
答案 0 :(得分:0)
即使我遇到了同样的问题,但你使用TRIM for column的提示节省了我的一天。因为我寻找了很长时间,但无法弄清楚。
除此之外,我还可以通过以下更改来解决我的问题:
我们使用CHAR数据类型查询where子句中使用的一些列。这导致问题从NHibernate获取数据。我们将该列的数据类型从CHAR更改为VARCHAR2,甚至更新了实际大小的数据,并从Where子句中删除了TRIM,TRICK WORKED !!!! :)
所以,任何人都面临这种问题,首先检查你是否有任何带有CHAR的列,然后更改为VARCHAR2。
但还有一件事需要记住:如果您从ASP.Net Development Server运行应用程序,请关闭它并重新运行您的应用程序。因为如果打开Asp.Net开发服务器,并且如果对 NOT 的数据类型进行任何更改,则在oracle连接中刷新。因此,最好关闭ASP.Net Development服务器,然后重新运行该应用程序。
希望我的观点将来会对某人有所帮助!!
此致
Sree Harshavardhana
答案 1 :(得分:-4)
如果希望SQL参数使用SQL存储过程
,则不在SQL查询中使用参数