2010-01-14 6 views
1

C#에서 sqlbulkcopy를 실행하면 오류가 발생합니다. WriteToServer : 연결 속성이 초기화되지 않았습니다.WriteToServer : 연결 속성이 초기화되지 않았습니다. sqlbulkcopy 오류

WriteToServer 명령에서 발생합니다. 연결이 열려 있습니다.

using (SqlBulkCopy s = new SqlBulkCopy(conn)) 
{ 
    foreach (DataTable dt in ds.Tables) 
    { 

    s.DestinationTableName = "tmp_" + dt.TableName; 
    s.NotifyAfter = 5000; 
    s.SqlRowsCopied += new SqlRowsCopiedEventHandler(s_SqlRowsCopied); 
    s.WriteToServer(dt); 
    s.Close(); 
    } 
} 

올바른 코드 : 나는 foreach 루프를 통해 첫 번째 패스가 제대로 실행되고 있음을 추측 할 눈에서

using (SqlBulkCopy s = new SqlBulkCopy(conn)) 
{ 
    foreach (DataTable dt in ds.Tables) 
    { 
    s.DestinationTableName = "tmp_" + dt.TableName; 
    s.NotifyAfter = 5000; 
    s.SqlRowsCopied += new SqlRowsCopiedEventHandler(s_SqlRowsCopied); 
    s.WriteToServer(dt); 
    } 
    s.Close(); 
} 
+0

''s.Close()'를 모두 없앨 수 있습니다. @ Yooder의 답변에 남긴 의견을 참조하십시오. –

답변

1

s.Close(); 따라서는 SqlBulkCopy 인스턴스를 청소하고 Connection 속성을 삭제한다 두 번째 패스에서 예외를 생성합니다.

+0

또한 명시 적으로 닫을 필요가 없습니다. sqlBulkCopy는'IDisposable'을 구현하기 때문에's.Close()'호출을 완전히 제거 할 수 있습니다. 따라서 기존의'using' 블록은 닫고 처리합니다. –

+1

나는 그것을 남겨두고, 명백한 클로저는 중복되어있다. 그러나 '사용하기'블록이 어떻게 든 사라지면 좋을 것이다. 개인적으로 필자의 선호는 작은 최적화를 컴파일러에 남겨 두는 것이다. (그것들은 상당히 멋지다) 코드를 가능한 한 읽기 쉽고 명확하게 유지한다. – STW

관련 문제