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



我的代码有问题:

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 开发人员)中执行它,它会得到 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 开发人员上复制查询以两种方式工作。所以我们有一些运气解决了这个问题,但我们不知道为什么现在它有效?有什么想法吗?

即使我也面临同样的问题,但是您使用 TRIM 列的提示挽救了我的一天。因为我找了很久,但无法弄清楚。

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

我们使用 CHAR 数据类型,这些列在查询 where 子句中使用。这导致问题从NHibernate获取数据。我们将该列的数据类型从 CHAR 更改为 VARCHAR2,甚至使用实际大小更新数据,并从 Where 子句中删除 TRIM,TRICK 起作用了!!!:)

因此,任何人都面临此类问题,请首先检查您是否有任何带有CHAR的列,然后更改为VARCHAR2。

但您必须记住的另一件事是:如果您从开发服务器运行应用程序 ASP.Net 请关闭它并重新运行应用程序。因为如果打开 Asp.Net 开发服务器,并且如果您对数据类型进行了任何更改,这些更改将不会在 oracle 连接中刷新。因此,最好关闭 ASP.Net 开发服务器,然后重新运行应用程序。

希望我的积分将来能帮助某人!!

问候

斯里·哈沙瓦尔达纳

如果您希望 SQL 参数

使用 SQL 存储过程,则不要在 SQL 查询中使用参数

最新更新