2011-01-10 3 views
0

GetUpdateCommand() 또는 GetInsertCommand()에서 SqlCommandBuilder에 이르기까지 생성 된 SqlCommand는 Connection 멤버가 설정되어 있지만 닫힌 상태이기 때문에 질문합니다. 이 개체에 연결 멤버가 표시되지 않고 SqlCommandBuilder.DataAdapter.SelectCommand의 연결이 열려 있기 때문에 어떤 연결을 사용하는지 궁금합니다 (업데이트/삭제/InsertCommand 속성이 null 임).SqlCommandBuilder는 쿼리를 생성하기 위해 어떤 연결을 사용합니까?

어디에서 GetUpdateCommand() 또는 GetInsertCommand()을 실행하기 전에 연결의 상태를 확인해야합니까? 아니면 내면 연결을 열어야합니까? 에 GetXXXCommand를 호출 할 때

가 BTW, 내가 SQL 서버 2008

+0

연결해야합니까? SELECT (선택)에서 메타 데이터가 필요합니다. –

+0

예이 메서드로 생성 된 명령을 실행할 때 "ExecuteNonQuery가 열려 있고 사용 가능한 연결이 필요합니다. 연결의 현재 상태가 닫힙니다."라는 예외가 발생하므로 확실합니다. – Antoine

답변

0

AFAIK 새 명령을 만들기 위해 SqlCommandBuilder.DataAdapter.SelectCommand의 연결을 사용하고 있지만 명령에 처음 액세스 할 때만 수행됩니다. 첫 x 째 시도 후 명령 인스턴스는 보유되고 명령 텍스트 만 재생성됩니다.

+0

예, 이전에 반환 된 SqlCommand-instances에서 명령 텍스트가 변경되면서 * GetInsertCommand *가 여러 번 호출됩니다. 하지만 결국에는 생성 된 명령이 * SqlCommandBuilder.DataAdapter.SelectCommand * –

+0

에서 연결을 사용한다는 것을 의미하지만 이는 연결 상태를 설명하지 않습니다. 어쨌든 명령 연결을 다시 설정하여 문제를 우회했는데 지금까지는 문제가 없습니다. – Antoine

0

와 닷넷 4 사용하여 SqlCommandBuilder는 내부적으로 DataAdapter (DataAdapter.SelectCommand.Connection.CreateCommand())에 설정된 연결에 새 명령을 생성합니다. 이것은 빌더가 생성하는 모든 명령에 대해 연결이 동일해야하며 열림/닫힘 상태도 동일해야 함을 의미합니다.

에는 상태가 열려 있다고 판단되는 코드는 무엇입니까? SqlCommandBuilder.GetInsertCommand().Connection!

+0

GetUpdateCommand()를 호출 한 후 디버거에서보고 있습니다. 질문의 설명에서 설명했듯이 생성 된 명령에서 ExecuteNonQuery()를 실행할 때 오류를 디버깅 할 때이 사실을 알게되었습니다. – Antoine

+0

나는이 문제에 대해 암시 적으로 디버거를 신뢰하지 않고 실제 코드 테스트를 수행하거나 ... 아니면 연결을 시도하기 전에 연결이 열려 있는지 확인합니다. –

+0

퍼포먼스 측면에서 볼 때, 이미 열린 커넥션을 사용하는 것이 더 좋을 것 같습니다. – Antoine

관련 문제