1

Windows 7 で Informix を NHibernate と連携させようとしています。現在、informix で正常に動作する接続文字列があります。

データベース=db;サーバー=サーバー:ポート;uid=ユーザー名;パスワード=パスワード;プーリング=false

IBM.Data.Informix .NET プロバイダー バージョン 9.0.0.2 を使用しています。

実行中の Informix サーバーでこのプロバイダーを使用すると、さまざまなアプリケーションが正常に動作します。

nhibernate アプリケーションは現在、informix サーバーに接続していますが、問題はそれが生成する SQL の形式です。

私のnhibernateコードがこのように見える場合、

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構成ファイルに追加しようとしましたが、

<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 の使用方法に関する一貫したドキュメントを見つけることができませんでした。また、使用しているデータベースの種類によって異なるようです。

4

4 に答える 4

2

どのバージョンのNHibernateを使用していますか?

FieldValueのプロパティタイプは何ですか?

私はInformixでNHibernateを使用していますが、ブール制限のあるクエリは正常に機能します。関連する構成値は次のとおりです。

<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.IfxDriver</property>
<property name="dialect">NHibernate.Dialect.InformixDialect1000</property>
于 2009-12-16T20:12:06.237 に答える
1

質問の元のバージョンの解説

これに答えるには、さらに多くの情報が必要になります。また、コメントに収まるよりも多くの情報を要求する必要があります。

まず、議論から、Windows のいくつかのバリアントで IBM Informix Dynamic Server (IDS) を使用していると思います (ただし、どのバージョンですか?)。使用している IDS のバージョンを教えてください。また、どのバージョンの ClientSDK を使用していますか?

次に、何らかのプログラムを使用して IDS データベースに接続できると仮定します。問題は、アクセス自体ではなく、NHibernate を介したアクセスに関連しています。IDS にまったくアクセスできないことが問題である場合、デバッグ手順は「別のアクセス方法を使用しない」場合とはかなり異なります。

別の方法で接続する場合、(a) その別の方法は何ですか? (b) 使用する接続文字列は何ですか? 文字列値の「構造の詳細」を確認したいと思います。たとえば、データベースを「sensitive@secret」と指定した場合、「xxxxxxxxx@yyyyyy」という表記を確認したいと思います。なぜなら、名前が機密で機密であることを必ずしも知る必要はありませんが、知っておく必要があるからです。名前がどのように見えるかを大まかに知っています。文字列内の他の値についても同様です。機密情報を削除したとおっしゃいましたが、非常に徹底的に削除したため、提供した情報が適切であったかどうかはわかりません。

SETNET32 を使用して Informix 環境値を設定しましたか? Windows プラットフォームにのみ適用される質問です (Unix は通常の環境変数を使用し、中央レジストリは使用しません)。もしそうなら、あなたは何を設定しましたか?

NHibernate 以外のパッケージで動作する接続文字列は、NHibernate で動作しない文字列とどのように比較されますか?

最後に (今のところ)、IBM DB2 .NET ドライバーと Informix OLEDB ドライバーの両方を使用しようとしたことを示しました。DB2 .NET ドライバーは DRDA プロトコルを使用して IDS と対話するのに対し、Informix ドライバーは SQLI プロトコルを使用することに注意する必要があります。デフォルトでは、IDS は SQLI 接続のみを listen します。DRDA 接続を受け入れるように IDS を構成する必要があります。これを修正すると、IDS 管理の詳細の一部に入ります。対処する必要がないことを願っていますが、対処する必要があるかもしれません。

SOに情報を取得する方法は? 質問を編集して、質問に追加情報を追加して、他の人が問題を簡単に確認できるようにすることをお勧めします。(私は Windows 上の IDS の専門家ではありません。私の裏庭は Unix ベースです。答えを提供するために他の人に手伝ってもらう必要があるでしょうが、必要な情報はまだ入手できません。)

修正された質問に対する解説

trueIDS は BOOLEAN 型を非正統的な方法でサポートします。 or false(またはunknown) をブール値として認識しません。't'代わりにandを使用し'f'ます。したがって、NHibernate によって生成されたコードは IDS に対して有効ではありません (ただし、有効であるべきという趣旨の引数は受け入れます)。問題を解決する良い方法があるかどうかはわかりません。true と false の代わりに引用符で囲まれた文字を渡すように NHibernate を説得できれば、勝機はあります。

于 2009-12-02T01:56:51.330 に答える
1

このため: fieldValue = 'T' データベースで fieldValue はブール値ではなく Char(1) 型であるという結論を導き出しています。その場合は、次を使用する必要があります。

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

これはテストしていませんが、Informix 固有の問題ではないと思います。別のデータベースでも同じエラーが発生します。

これは、すべての NHibernate 方言が ToBooleanValueString メソッドを提供するためです。デフォルトでは、ブール値は "0" と "1" にマップされ (他のデータベースでは "T" を期待できません)、Informix では "t" と "f" にマップされます。どうやら、このメソッドは Informix の障害ではない Restrictions.Eq では使用されていません。

おそらく、Restrictions.Eq は内部的にブール変数を使用しており (引数がブール値であるため)、データベース列が文字型であるため、その「ToString」メソッドを呼び出します。true 値に対する "ToString" の結果は、単に "true" です。

于 2009-12-11T18:23:19.093 に答える