SqlBulkCopy를 사용하고 벌크 삽입물을 훑어 보는 방법

c# glimpse sqlbulkcopy

문제

우리의 응용 프로그램에서는 SqlBulkCopy 클래스를 사용하여 데이터베이스의 대량로드를 용이하게합니다. 최근에 우리 솔루션에 Glimpse를 추가하려고 시도했지만 코드가 잘못된 캐스트로 실패합니다.

System.InvalidCastException : 'Glimpse.Ado.AlternateType.GlimpseDbConnection'형식의 개체를 'System.Data.SqlClient.SqlConnection'형식으로 캐스팅 할 수 없습니다.

Glossse ADO가 랩핑 된 SqlConnection 을 사용하여 마법을 가능하게하기 때문입니다. 아쉽게도 SqlBulkCopy 에는 SqlConnection 이 필요하므로 DbConnection 을 캐스팅해야합니다.

일괄 삽입을 프로파일 링 할 수있는 기본 방법이 없습니까? 지금까지 내가 만난 유일한 해결 방법은 다음과 같습니다.

(SqlConnection)((GlimpseDbConnection)dbConnection).InnerConnection

그것은 GlimpseDbConnection을 명시 적으로 참조해야하기 때문에 추한 것이며 아마도 추적을하기 위해 커스텀 타임 라인 이벤트를 추가해야 할 것입니다. 이 문제를 해결하는 추가 기능이 있습니까?

인기 답변

나는 EntityFramework의 DbContext 사용하여이 접근법을 사용하고있다.

DbContext Db = /* ... */;

var glimpseDbConnection = Db.Database.Connection as GlimpseDbConnection;
var sqlConnection = glimpseDbConnection != null ? (SqlConnection)glimpseDbConnection.InnerConnection : (SqlConnection)Db.Database.Connection;

var glimpseDbTransaction = Db.Database.CurrentTransaction.UnderlyingTransaction as GlimpseDbTransaction;
var sqlTransaction = glimpseDbTransaction != null ? (SqlTransaction)glimpseDbTransaction.InnerTransaction : (SqlTransaction)Db.Database.CurrentTransaction.UnderlyingTransaction;

using (var bulkCopy = new SqlBulkCopy(sqlConnection, SqlBulkCopyOptions.Default, sqlTransaction))
{
    var dataTable = /* ... */;
    bulkCopy.BatchSize = 2000;
    bulkCopy.BulkCopyTimeout = TimeSpan.FromMinutes(5).Seconds;
    bulkCopy.DestinationTableName = /* ... */;
    bulkCopy.WriteToServer(dataTable);
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.