2009-07-14 2 views
0

업데이트 : "ExecuteNonQuery"명령으로 문제를 추적했습니다. 그것이 업데이트 도중 실패하거나 삽입 중에 중단되는 것입니다. 일반 ADO.NET과 트랜잭션을 사용하여 간단한 예제를 사용하면 완벽하게 작동합니다. 또한 ... 내 로컬 가정용 컴퓨터 연결 Oracle Express 버전에서 잘 작동합니다. 어떤 종류의 서버 설정에서 다시 가리키고 ?? 디버깅하는 동안 NHibernate 코드를 한 단계 씩 들어가는 것이 좋겠지 만 지금까지는 소스를 다시 작성하고 해당 DLL 및 PDB 파일을 사용하더라도 여전히이 기능을 설정할 수 없습니다. 누구든지 전에 이것을 할 수 있었습니까?오라클의 삽입과 업데이트로 NHibernate 트랜잭션이 실패합니다

나는 잠시 동안 내 머리를 긁적 봤습니다. 지금 NHibernate와 오라클 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" /> 

바쁜 삼일 ... 그러나 그것은 해결 될 : D