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 作为列的提示挽救了我的一天。因为找了很久,还是没弄明白。

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

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

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

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

希望我的观点能对未来的人有所帮助!!

问候,

斯里哈沙瓦达纳

于 2012-07-04T14:22:06.637 回答
-4

如果您希望 SQL 参数使用 SQL 存储过程,则您没有在 SQL 查询中使用参数

于 2012-06-20T00:14:30.273 回答