.Net1.1에서는 전체 DataTable의 모든 데이터를 데이터베이스에 일괄 삽입하거나 서로 다른 데이터 소스 간을 마이그레이션하는 것이 그리 편리하지 않습니다. .Net2.0에서는 DataTable 또는 DataReader를 통해 일괄적으로 데이터를 마이그레이션할 수 있도록 SQLClient 네임스페이스 아래에 몇 가지 새로운 클래스가 추가되었습니다. 데이터 소스는 관계형 데이터베이스나 XML 파일에서 나올 수도 있고 WebService에서 반환한 결과에서도 나올 수 있습니다. 가장 중요한 클래스 중 하나는 SqlBulkCopy 클래스입니다. 이 클래스는 데이터 원본에서 대상 데이터베이스로 데이터를 쉽게 마이그레이션하는 데 도움이 됩니다.
먼저 간단한 예를 통해 이 클래스의 사용법을 살펴보겠습니다.
날짜시간 시작시간;
protected void Button1_Click(객체 전송자, EventArgs e)
{
startTime = DateTime.Now;
문자열 SrcConString;
문자열 DesConString;
SqlConnection SrcCon = new SqlConnection();
SqlConnection DesCon = 새로운 SqlConnection();
SqlCommand SrcCom = new SqlCommand();
SqlDataAdapter SrcAdapter = 새로운 SqlDataAdapter();
DataTable dt = new DataTable();
SrcConString =
ConfigurationManager.ConnectionStrings["SrcDBConnectionString"].ConnectionString;
DesConString =
ConfigurationManager.ConnectionStrings["DesDBConnectionString"].ConnectionString;
SrcCon.ConnectionString = SrcConString;
SrcCom.Connection = SrcCon;
SrcCom.CommandText = " SELECT * [SrcTable]에서";
SrcCom.CommandType = CommandType.Text;
SrcCom.Connection.Open();
SrcAdapter.SelectCommand = SrcCom;
SrcAdapter.Fill(dt);
SqlBulkCopy DesBulkOp;
DesBulkOp = 새로운 SqlBulkCopy(DesConString,
SqlBulkCopyOptions.UseInternalTransaction);
DesBulkOp.BulkCopyTimeout = 500000000;
DesBulkOp.SqlRowsCopied +=
새로운 SqlRowsCopiedEventHandler(OnRowsCopied);
DesBulkOp.NotifyAfter = dt.Rows.Count;
노력하다
{
DesBulkOp.DestinationTableName = "SrcTable";
DesBulkOp.WriteToServer(dt);
}
잡기 (예외예외)
{
lblResult.Text = ex.Message;
}
마지막으로
{
SrcCon.Close();
DesCon.Close();
}
}
개인 무효 OnRowsCopied(객체 보낸 사람, SqlRowsCopiedEventArgs 인수)
{
lblCounter.Text += args.RowsCopied.ToString() + " 행이 복사되었습니다<Br>";
TimeSpan copyTime = DateTime.Now - startTime;
lblCounter.Text += "복사 시간:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + " 초";
}
그런 다음 다음 코드 줄을 자세히 분석합니다.
SqlBulkCopy DesBulkOp;
DesBulkOp = new SqlBulkCopy(DesConString, SqlBulkCopyOptions.UseInternalTransaction); 생성자는 대상 데이터베이스를 지정합니다. SqlBulkCopyOptions.UseInternalTransaction을 사용하면 데이터 마이그레이션 중에 오류나 예외가 발생합니다. 롤백이 발생합니다. 다른 옵션은 MSDN을 참조하세요.
DesBulkOp.BulkCopyTimeout = 500000000;
작업 완료에 대한 시간 초과 시간을 지정합니다.
DesBulkOp.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnRowsCopied);
DesBulkOp.NotifyAfter = dt.Rows.Count;
노력하다
{
DesBulkOp.DestinationTableName = "SrcTable";
DesBulkOp.WriteToServer(dt);
}
NotifyAfter 속성은 알림 이벤트 이전에 처리할 데이터 행 수를 지정하며, 여기서는 테이블의 행 수로 지정되며, 전체 마이그레이션 프로세스 시간을 출력하기 위해 SqlRowsCopied 이벤트가 추가됩니다. WriteToServer 메서드는 데이터 원본을 대상 데이터베이스에 복사합니다. WriteToServer 메서드를 사용하기 전에 먼저 대상 데이터베이스의 테이블 이름인 DestinationTableName 특성을 지정해야 합니다.
예를 들어
SqlTransaction Transaction;
거래 =
SrcCom.Connection.BeginTransaction();
SqlBulkCopy DesBulkOp;
DesBulkOp = 새 SqlBulkCopy(새 SqlConnection(DesConString),
SqlBulkCopyOptions.Default,
거래)
시도
{
//..
}
잡다{}
마지막으로
{
트랜잭션.커밋();
}
데이터 소스 필드를 대상 데이터의 다른 이름의 필드에 매핑할 수 있는 SqlBulkCopyColumnMapping 클래스도 있습니다. 즉, 대상 데이터와 소스 데이터의 열 이름이 다른 경우 이 클래스를 매핑에 사용할 수 있습니다.
SqlBulkCopyColumnMapping ColMap = new SqlBulkCopyColumnMapping("SrcCol", "DesCol");
DesBulkOp.ColumnMappings.Add(ColMap);
또는 매핑을 직접 추가할 수도 있습니다.
DesBulkOp.ColumnMappings.Add("SrcCol", "DesCol");
성능 문제:
위의 예를 사용하여 약 20,000개의 레코드를 테스트하고 마이그레이션하는 데 1초도 걸리지 않았습니다. 성능은 여전히 좋습니다. 또한 SQL 프로필을 사용하여 마이그레이션 이벤트를 모니터링하면 요청 레코드가 매우 적다는 것을 알 수 있습니다. SqlBulkCopy를 사용하면 데이터 마이그레이션 시간을 크게 줄일 수 있다고 합니다.