我的代码有问题:
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 查询中使用参数