2009-07-14 13 views
0

投稿更新:私は "ExecuteNonQuery"コマンドでこの問題を追跡しました。これは、更新中に失敗したり、挿入中にハングしたりするものです。プレーンなADO.NETとそのトランザクションを使った簡単な例を試してみると、完璧に動作します。また、...それは私のローカル家庭のコンピュータ接続Oracle Express版で素晴らしい作品。もう一度サーバーの設定の何かを指して?? デバッグ中にNHibernateコードにステップインするのは良いことですが、これまでソースを再構築してdllファイルとpdbファイルを使用していても、まだこれを設定することはできません。誰もこれを前にすることができましたか?NHibernateトランザクションがOracleの挿入と更新で失敗する

私は今これについて私の頭を掻いてきました。私は数日間、NHibernateとOracle 10gデータベースを使って開発してきましたが、これまではselectステートメントだけを使っていました。

私は今、最初の挿入(保存)および更新ステートメントの実装を開始しましたが、テストはすべて失敗します。 これらはすべてtransaction.commit()部分で失敗します。

INSERT(保存)を実行すると、コードはtransaction.commit()に達しますが、「stucked」になります。テストは前進することなく走り続けます。 UPDATEを行う際に これはテストの出力である

NHibernate: select hibernate_sequence.nextval from dual 
NHibernate: INSERT INTO MOB_PL_MAPPING_TEST (DES, TEST_ID) VALUES (:p0, :p1);:p0 = 'This is a test!', :p1 = 161 

(テストは稼働し続けることに注意)、transaction.commit()は失敗し、私は次のエラー・スタック受け取る:

NHibernate: SELECT test0_.TEST_ID as TEST1_10_0_, test0_.DES as DES10_0_ FROM MOB_PL_MAPPING_TEST test0_ WHERE test0_.TEST_ID=:p0;:p0 = 61 
NHibernate: UPDATE MOB_PL_MAPPING_TEST SET DES = :p0 WHERE TEST_ID = :p1;:p0 = 'Changed!', :p1 = 61 
TestCase 'Data.Tests.Test_Update_on_Test_Table' 
failed: NHibernate.TransactionException : Rollback failed with SQL Exception 
    ----> System.InvalidOperationException : This OracleTransaction has completed; it is no longer usable. 
    c:\CSharp\NH\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs(260,0): at NHibernate.Transaction.AdoTransaction.Rollback() 
    E:\SubVersion\Application\Src\Data\UnitOfWork\Data.UnitOfWork\GenericTransaction.cs(26,0): at Data.UOW.GenericTransaction.Rollback() 
    E:\SubVersion\Application\Src\Data\UnitOfWork\Data.UnitOfWork\UnitOfWorkImplementor.cs(49,0): at Data.UOW.UnitOfWorkImplementor.TransactionFlush(IsolationLevel isolationLevel) 
    E:\SubVersion\Application\Src\Data\UnitOfWork\Data.UnitOfWork\UnitOfWorkImplementor.cs(36,0): at Data.UOW.UnitOfWorkImplementor.TransactionFlush() 
    E:\SubVersion\Application\Src\Data\Data.Tests\Repositories\LoyaltyRepositoryTests.cs(159,0): at Data.Tests.Test_Update_on_Test_Table() 
    --InvalidOperationException 
    at System.Data.OracleClient.OracleTransaction.AssertNotCompleted() 
    at System.Data.OracleClient.OracleTransaction.Rollback() 
    c:\CSharp\NH\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs(246,0): at NHibernate.Transaction.AdoTransaction.Rollback() 

私はオラクルには分かりませんが、トランザクションを確立すると問題が発生するようです。 select文(GET)の同じコード(トランザクションを使用)は正常に動作しますが。 これはoracle構成の問題(挿入/更新トランザクションのブロック)か、アプリケーション・レベルで何か他のものを構成する必要がありますか?

ここで誰かが私を助けたり、発生する可能性のある問題についてもっと明るく説明できますか?

ありがとうございます。

答えて

0

NHibernateコードをデバッガに接続することを管理した後、Commandオブジェクトが実行されるポイントまでコードをステップ実行することができました。 この問題は、パラメータの型にあります。文字列の型が "String"に設定されているパラメータ。ここで、 "AnsiString"になります。

文字がIDにマッピングされているときに私は既にこの記事に触れていました http://www.jameskovacs.com/blog/NHibernateAndTheCaseOfTheCrappyOracleErrorMessage.aspx しかし、それ以上は考えていませんでした。

いずれの方法でも、マッピングの各文字列プロパティに型を追加することで問題が解決されました。

<property name="Description" column="DES" type="AnsiString" /> 

忙しい3日間...しかし、それは解決しています:D

関連する問題