带有字符串参数的NHibernate SQL查询问题

时间:2012-06-19 15:23:10

标签: sql nhibernate parameters

我遇到了这段代码的问题:

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上的复制查询都以两种方式工作。 所以我们有一些运气来解决这个问题,但我们不知道为什么它现在有效呢? 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

即使我遇到了同样的问题,但你使用TRIM for column的提示节省了我的一天。因为我寻找了很长时间,但无法弄清楚。

除此之外,我还可以通过以下更改来解决我的问题:

我们使用CHAR数据类型查询where子句中使用的一些列。这导致问题从NH​​ibernate获取数据。我们将该列的数据类型从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查询中使用参数