2009-07-14 57 views
0

發佈更新:我已經在命令「ExecuteNonQuery」中跟蹤了這個問題。這是在更新期間失敗或在插入期間掛起的那個。嘗試一個簡單的例子,使用普通的ADO.NET和他們的交易是完美的。另外...它在我的本地家用計算機連接Oracle Express版本上效果很好。在某種服務器配置中再次指向它? 在調試時進入NHibernate代碼會很好,但到目前爲止,我仍然無法設置它,即使我已經重建源代碼並使用這些dll和pdb文件。有人能夠做到這一點嗎?NHibernate事務失敗,並在Oracle上插入和更新

我一直在這裏撓我的頭一陣子。我已經使用NHibernate和Oracle 10g數據庫進行了幾天的開發,到目前爲止只使用了select語句,這些語句對於映射都非常有用。

我現在開始執行我的第一次插入(保存)和更新語句,但測試都失敗。 它們都在transaction.commit()部分上失敗。

執行INSERT(保存)時,代碼將達到transaction.commit(),但後來得到「stucked」。測試繼續運行,無需前進。 這是測試的輸出(注意試驗保持運行)

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 

當執行UPDATE,所述器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代碼連接到我的debuger後,我能夠遍歷代碼,直到Command對象執行的位置。 那裏,問題是在參數類型中找到。參數,其中一個字符串的類型設置爲「String」,其中他們被認爲是「AnsiString」。

原來,當我將一個字符串映射到一個ID http://www.jameskovacs.com/blog/NHibernateAndTheCaseOfTheCrappyOracleErrorMessage.aspx 但我沒有想到更多它時,我已經遇到了這篇文章。

無論採用哪種方式,將類型添加到映射中的每個字符串屬性都可以解決問題。

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

忙碌3天...但它解決了:d