카테고리 없음
[씨#] SqlBulkCopy에서 NHibernate 트랜잭션 사용
행복을전해요
2021. 1. 10. 06:38
당연히 Ayende 는 이것도 다뤘 지만 꽤 끔찍합니다.
요점은 IDbCommand
NHibernate 트랜잭션에 일반 ADO.NET 인스턴스를 등록 할 수 있다는 것을 알고 있다는 것입니다 .
var cmd = new SqlCommand ();
if (session.Transaction != null && session.Transaction.IsActive)
session.Transaction.Enlist (cmd);
그러나은 SqlBulkCopy
아니고 IDbCommand
특정 생성자는 필요합니다 SqlTransaction
(따라서 공급자 독립성에 대해서는 이미 배를 건너 뛰었습니다). 따라서 치트-귀하의 예는 다음과 같이 보일 수 있습니다.
using (var session = NHibernateHelper.OpenSession ())
using (var transaction = session.BeginTransaction ()) {
using (var cmd = new SqlCommand ()) {
transaction.Enlist (cmd);
var bulk = new SqlBulkCopy ((SqlConnection)session.Connection,
SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers,
(SqlTransaction)cmd.Transaction);
}
// ...
transaction.Commit ();
}
의심 할 여지없이 오류 검사, 안전한 캐스트 등을 원할 것입니다. 불행히도 ( IDbTransaction
에서 를 얻는 것조차도) 이것을 수행하는 더 현대적이고 덜 무서운 방법을 알지 못합니다 ITransaction
.
Ayene에서이 게시물 확인 :
http://ayende.com/Blog/archive/2009/08/22/nhibernate-perf-tricks.aspx
그는 NHibernate StatelessSession 또는 SqlBulkCopy 옵션을 사용하여이를 수행하는 방법을 보여줍니다. 다음과 같은 샘플 코드를 보여줍니다.
var dt = new DataTable("Users");
dt.Columns.Add(new DataColumn("Id", typeof(int)));
dt.Columns.Add(new DataColumn("Password", typeof(byte[])));
dt.Columns.Add(new DataColumn("Username"));
dt.Columns.Add(new DataColumn("Email"));
dt.Columns.Add(new DataColumn("CreatedAt", typeof(DateTime)));
dt.Columns.Add(new DataColumn("Bio"));
for (int i = 0; i < count; i++)
{
var row = dt.NewRow();
row["Id"] = i;
row["Password"] = Guid.NewGuid().ToByteArray();
row["Username"] ="User " + i;
row["Email"] = i + "@example.org";
row["CreatedAt"] =DateTime.Now;
row["Bio"] = new string('*', 128);
dt.Rows.Add(row);
}
using (var connection =
((ISessionFactoryImplementor)sessionFactory).ConnectionProvider.GetConnection())
{
var s = (SqlConnection)connection;
var copy = new SqlBulkCopy(s);
copy.BulkCopyTimeout = 10000;
copy.DestinationTableName = "Users";
foreach (DataColumn column in dt.Columns)
{
copy.ColumnMappings.Add(column.ColumnName, column.ColumnName);
}
copy.WriteToServer(dt);
}
출처
https://stackoverflow.com/questions/2006024