2009-07-14 2 views
0

Post Update: Ich habe das Problem bei dem Befehl "ExecuteNonQuery" aufgespürt. Das ist derjenige, der während eines Updates fehlschlägt oder während einer Einfügung aufhängt. Ein einfaches Beispiel mit ADO.NET und ihren Transaktionen zu verwenden, ist perfekt. Auch ... es funktioniert gut auf meiner lokalen Heimcomputerverbindung eine Oracle Express Edition. Zeige es wieder in einer Art Serverkonfiguration? Es wäre schön, während des Debuggens in den NHibernate-Code zu gehen, aber bis jetzt bin ich noch nicht in der Lage, dies einzurichten, selbst wenn ich die Quelle neu erstellt habe und diese dll- und pdb-Dateien verwende. Konnte jemand das schon mal machen?NHibernate-Transaktion schlägt fehl mit Einfügen und Aktualisieren auf Oracle

Ich kratze mich schon seit einiger Zeit am Kopf. Ich entwickle seit einigen Tagen mit NHibernate und einer Oracle 10g-Datenbank, bisher nur mit Select-Anweisungen, die alle hervorragend mit dem Mapping funktionieren.

Ich begann nun, meine ersten einfügen (Speichern) und Update-Anweisungen zu implementieren, aber die Tests alle fehlschlagen. Sie alle schlagen auf dem transaction.commit() -Teil fehl.

Beim Ausführen einer INSERT (Speichern), erreicht der Code transaction.commit(), aber dann "stucked". Der Test läuft weiter, ohne sich vorwärts zu bewegen. Dies ist der Ausgang des Tests (beachten Sie, dass der Test am Laufen hält)

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 

Bei der Durchführung eines UPDATE, die transaction.commit() schlägt fehl, und ich erhalte folgende Fehlerstack:

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() 

Ich muss sagen, ich bin Orakel unbekannt, aber es scheint, dass die Einrichtung der Transaktion das Problem verursacht. Obwohl derselbe Code (mit Transaktionen) für eine Select-Anweisung (GET) funktioniert, funktioniert es gut. Könnte dies ein oracle-config-Problem sein (Blockierung einfügen/Transaktionen aktualisieren) oder muss ich etwas anderes auf Anwendungsebene konfigurieren?

Kann mir jemand hier helfen oder mehr Licht auf das Problem werfen?

Vielen Dank im Voraus.

Antwort

0

Nachdem ich den NHibernate-Code mit meinem Debugger verbunden habe, konnte ich den Code bis zu dem Punkt durchlaufen, an dem das Command-Objekt ausgeführt wird. Dort war das Problem in den Parametertypen zu finden. Parameter, bei denen eine Zeichenfolge den Typ "String" hatte, wobei sie als "AnsiString" angezeigt wurden.

Es stellte sich heraus, dass ich bereits in diesen Artikel gelaufen bin, als ich eine Zeichenkette auf eine ID http://www.jameskovacs.com/blog/NHibernateAndTheCaseOfTheCrappyOracleErrorMessage.aspx abbildete, aber nicht mehr darüber nachdachte.

In beiden Fällen wurde durch Hinzufügen des Typs zu jeder Zeichenfolgeneigenschaft in der Zuordnung das Problem behoben.

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

einem hektischen 3 Tage ... aber es ist gelöst: D