0

이있는 테이블에서 DataAdapter.Update/Refresh 후에 DataTable ID 열이 설정되지 않습니다. 단원 테스트에서 데이터베이스 resp를 준비하기 위해 일반 ADO.NET (DataTable, DataAdapter)을 사용합니다. 테스트 된 컴포넌트 자체는 NHibernate 2.1에서 실행된다. .NET 버전은 3.5이며 SqlServer 버전은 2005입니다."대신"-trigger (SqlServer 2005)

데이터베이스 테이블에는 ID 열이 기본 키로 있습니다. 일부 테이블은 삽입/업데이트 트리거 대신 적용됩니다 (이전 버전과의 호환성 때문에 변경할 수 없음). 트리거는 일반적으로 다음과 같이 작동 :

create trigger dbo.emp_insert 
    on dbo.emp 
    instead of insert 
as 
begin 
    set nocount on 
    insert into emp ... 
    select @@identity 
end 

(온 - 더 - 플라이 얇은 ADO.NET 래퍼에 의해 생성)을 ADO.NET 데이터 어댑터가 발행 삽입 문은의 DataRow에 다시 ID 값을 검색하려고 : 아이디 - 열은 데이터베이스에서 설정 한 ID 값을 유지 - 나는 일시적으로 트리거를 제거하면

exec sp_executesql N' 
insert into emp (...) values (...); 
select id, ... from emp where id = @@identity 
' 

는 그러나 DataRow를의 ID 열이 잘 작동, 여전히 0입니다.

이 작동
exec sp_executesql N' 
insert into emp (...) values (...); 
select scope_identity() 
' 

의 NHibernate에 POCO가 제대로 잘 세척 한 후 설정된 ID 속성이 있습니다 반면에

NHibernate에 인서트 문이 종류를 사용합니다. 트리거가 다른 범위에서 실행될 것으로 예상했기 때문에, @@ identity가 scope_identity()보다 더 적합해야합니다.

그래서 아무 문제도 생각하지 않고 ADO.NET에서도 @@ identity 대신 scope_identity()를 적용 할 것입니다. 그러나 이것은 아무 효과가 없으며 DataRow 값은 그에 따라 업데이트되지 않습니다.

이제 가장 중요한 부분은 : SqlServer 프로파일 러에서이 두 문을 복사하여 ("exec sp_executesql"을 포함하는) Management Studio 쿼리에 붙여 넣으면 결과가 반전 된 것처럼 보입니다! ADO.NET 버전이 작동하고, NHibernate 버전은 (scope_identity()를 선택하면 null을 반환하지 않습니다). 나는 검증하기 위해 여러 번 시도했지만, 아무 소용이 없었다. 글쎄, 사실 그것은 내가 기대했던 것인데, @@ 신원 확인이 가능하고 scope_identity()가 실패합니다.

물론 Management Studio에서 호출하면 NHibernate에서 발생하는 모든 결과와 데이터베이스에서 오는 결과 집합이 표시됩니다. ADO.NET은 또 다른 주제입니다. 또한 T-SQL SET에 정의 된 여러 세션 속성은 두 시나리오에서 다릅니다 (Management Studio 쿼리와 런타임의 응용 프로그램)

이것은 나에게 진정한 퍼즐입니다. 나는 그것에 대한 통찰력에 대해 행복 할 것이다. 고맙습니다!

답변

1

발견. ID 값은 실제로 내가 예상 한 열이 아닌 DataTable로 전송되었습니다. 기존 열 "id"를 사용하는 대신 ADO.NET은 새로운 열 "Column1"을 만들었습니다.

이유가 트리거 대신-의 말에이 라인 : 불행하게도

select @@identity 

, NHibernate에 (이 언급 된 트리거 대신-의 말에 "@@ ID를 선택"요구하는 것 Hibernate 포럼 게시, 그리고 지금 다시 확인 - 정말 필요합니다. 하지만 나는 여기에서 갈 수있다. (NHibernate 방언을 적용하는 것도 하나의 가능성이다) ...