2014-10-03 116 views
2

我試圖使用SqlBulkCopyServiceStack Ormlite和已經編寫了下面的擴展方法:爲什麼我不能將ServiceStack Ormlite連接轉換爲SqlConnection?

public static void BulkInsertSqlServer<T>(this IDbConnection dbConn, string targetTable, IEnumerable<T> data, params string[] columns) 
{ 
    Ensure.NotNull(dbConn); 
    Ensure.That(dbConn.State == ConnectionState.Open); 
    Ensure.NotNullOrEmptyOrWhiteSpace(targetTable); 
    Ensure.NotNull(data); 
    Ensure.NotNullOrEmpty(columns); 

    var sqlConnection = dbConn as SqlConnection; 

    using (var bcp = new SqlBulkCopy(sqlConnection)) 
    using (var reader = ObjectReader.Create(data, columns)) 
    { 
     bcp.BatchSize = data.Count(); 
     bcp.DestinationTableName = targetTable; 
     bcp.WriteToServer(reader); 
    } 
} 

對此我用:

_connFactory = new OrmLiteConnectionFactory(connStr, SqlServerOrmLiteDialectProvider.Instance); 

using (var db = _connFactory.Open()) 
using (var tran = db.BeginTransaction()) 
{ 
    db.BulkInsertSqlServer("User", users, "Name", "Age"); 

    var allRoles = new List<Role>(); 

    foreach (var listOfRoles in users.Select(d => d.Roles)) 
    { 
     allRoles.AddRange(listOfRoles); 
    } 

    db.BulkInsertSqlServer("Role", allRoles, "Name", "UserId", "IsAdmin"); 

    tran.Commit(); 
} 

然而sqlConnection總是空,任何想法?

+0

的DbConnection似乎並沒有在任何地方聲明。你已經調用了「this」dbConn。 – Fordio 2014-10-03 13:52:39

+0

@ Fordio-編輯。 – MaYaN 2014-10-03 14:16:06

+0

我只能建議它不從它繼承,它也不是SqlConnection。 – Fordio 2014-10-03 14:44:34

回答

4

因爲連接被包裹在一個管理OrmLiteConnectionWrapper,你可以得到的SqlConnection:

var adoNetConn = ((IHasDbConnection)dbConn).DbConnection;  
var sqlConnection = adoNetConn as SqlConnection; 
+0

太棒了,像魅力一樣工作,我想知道爲什麼你沒有增加對OrmLite批量加載的支持?我可以看到許多可以從SqlServer和SQLite中受益的人。 – MaYaN 2014-10-03 18:13:59

+0

@MaYaN優先開發新功能,[對此功能請求進行投票](http://servicestack.uservoice.com/forums/176786-feature-requests/suggestions/6429966-add-bulkinsert-bulk-copy-to- the-ormlite數據庫)註冊興趣。 – mythz 2014-10-03 18:25:11

+0

謝謝,會做。 – MaYaN 2014-10-03 18:32:48

相關問題