首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Informix与NHibernate

Informix与NHibernate
EN

Stack Overflow用户
提问于 2009-12-02 08:48:43
回答 4查看 2.7K关注 0票数 1

我正在尝试让Informix在Windows7上使用NHibernate。我现在有一个连接字符串可以很好地使用informix,它是这样的:

Database=db;Server=server:port;uid=username;password=password;pooling=false

我使用的是IBM.Data.Informix .NET provider版本9.0.0.2。

在我们运行的Informix服务器上,我们有许多不同的应用程序可以很好地使用该提供程序。

我的nhibernate应用程序现在正在连接到informix服务器,但问题出在它生成的SQL的形式上。

如果我的nhibernate代码看起来像这样,

代码语言:javascript
复制
using (ISession session = Config.SessionFactory.OpenSession())
{
    return session
        .CreateCriteria<DBTable>()
        .Add(Restrictions.Eq("FieldValue", true))
        .List<DBTable>();
}

我是Informix的新手,但如果我没记错的话,正确的SQL应该是这样的,

select * from DBTable where fieldValue = 'T‘

但它所产生的SQL却是,

select * from DBTable where fieldValue = True

这不管用。我试着在nhibernate配置文件中添加这样的东西,

代码语言:javascript
复制
<property name="query.substitutions">True=T,False=F</property>
<property name="query.substitutions">True 'T',False 'F'</property>
<property name="query.substitutions">True='T',False='F'</property>
<property name="query.substitutions">True T,False F</property>

但这似乎并不管用。关于如何使用query.substitutions,我找不到一致的文档,而且它似乎根据您使用的数据库类型而有所不同。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-17 04:12:06

您使用的是什么版本的NHibernate?

FieldValue的属性类型是什么?

我在Informix中使用NHibernate,带有布尔约束的查询可以很好地工作。以下是相关的配置值:

代码语言:javascript
复制
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.IfxDriver</property>
<property name="dialect">NHibernate.Dialect.InformixDialect1000</property>
票数 2
EN

Stack Overflow用户

发布于 2009-12-02 09:56:51

对问题原文的评论

要回答这个问题,需要更多的信息--而且需要更多的信息,而不是评论。

首先,根据讨论,我假设您正在Windows的某些变体上使用IBM Informix Dynamic Server (IDS) (但是是哪一种呢?)。请问您使用的是什么版本的IDS?另外,您使用的是哪个版本的ClientSDK?

接下来,我假设您可以使用某个程序连接到IDS数据库-问题与通过NHibernate进行访问有关,而不是与访问有关。如果您的问题是您根本不能访问IDS,那么调试步骤与“不通过替代访问方法”有很大的不同。

当您通过另一种方法连接时,(a)另一种方法是什么,以及(b)您使用的连接字符串是什么?我想看看字符串值的“结构细节”。例如,如果您将数据库指定为“sensitive @ secret”,我希望看到符号“xxxxxxxxx@yyyyyy”,因为虽然我们不一定需要知道名称是否敏感和机密,但我们确实需要知道名称的大致外观。字符串中的任何其他值也是如此。你说你删除了敏感信息,但你做得太彻底了,我不知道你提供的是不是明智的。

您是否使用过SETNET32来设置任何Informix环境值--这个问题只适用于Windows平台(Unix使用常规环境变量,而不是中央注册表)?如果有,你设置了什么?

非NHibernate包的工作连接字符串与NHibernate的非工作字符串相比如何?

最后(现在),您展示了已经尝试使用IBM驱动程序和Informix DB2 .NET驱动程序。需要注意的是,Informix驱动程序使用.NET协议与IDS通信。默认情况下,IDS只侦听SQLI连接-您必须配置IDS才能接受DRDA连接。解决这个问题涉及到IDS管理的一些细节-我希望我们不需要处理这些细节,但我们可能需要处理这些细节。

如何将信息放到SO上?我建议您编辑您的问题,将额外的信息添加到问题中,以便其他人可以很容易地看到问题。(我不是Windows上的IDS专家;我的后院是基于Unix的。我可能不得不让其他人帮助提供答案,但还没有必要的信息。)

对经修正的问题的评论

IDS以一种非正统的方式支持布尔类型-它不将truefalse (或unknown)识别为布尔值;而是使用't''f'。因此,NHibernate生成的代码对于入侵检测系统是无效的(尽管我接受应该有效的论点)。我不清楚是否有好的方法来解决这个问题。如果您能说服NHibernate传递引用的字符,而不是true和false,那么您就有了战斗的机会。

票数 1
EN

Stack Overflow用户

发布于 2009-12-12 02:23:19

因此: fieldValue = 'T‘我得出结论,fieldValue在数据库中有Char(1)类型,而不是布尔值。如果是这样的话,您应该使用:

Restrictions.Eq("FieldValue", "T")

我没有对此进行测试,但我认为您的问题不是Informix特有的。对于不同的数据库,您会得到相同的错误。

这是因为每种NHibernate方言都提供ToBooleanValueString方法。默认情况下,布尔值被映射到"0“和"1”(所以在其他数据库中不能期望"T“),而对于Informix,它被映射到"t”和"f“。显然,Restrictions.Eq没有使用这种方法,这不是Informix的错误。

可能Restrictions.Eq在内部使用了布尔变量(因为您的参数是boolean),并调用了它的"ToString“方法,因为数据库列是字符类型。TRUE值的"ToString“结果就是" true”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1830002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档