2016-08-17 56 views
1

我有一個問題,使用fastmember,其中我有一個公共可爲空的屬性(日期時間)爲我的類,但是當我嘗試並將其插入到數據庫列值是一個空字符串不是導致拋出異常的null,關於如何使列值爲空的任何想法?FastMember和可爲空的屬性

public class MyClass 
{ 
    public DateTime? MyDate {get;set;} 
} 

DataTable testTable = new DataTable(); 
using (var reader = ObjectReader.Create(myClassList)) 
{ 
    testTable.Load(reader); 
} 

using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connection"].ConnectionString)) 
{ 
    SqlTransaction transaction = null; 
    connection.Open(); 
    try 
    { 
     transaction = connection.BeginTransaction(); 
     using (var sqlBulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, transaction)) 
     { 
       sqlBulkCopy.BulkCopyTimeout = 0; 
       sqlBulkCopy.BatchSize = batchSize; 
       sqlBulkCopy.DestinationTableName = "myTable"; 
       for (var cols = 0; cols < testTable.Columns.Count; cols++) 
       { 
        sqlBulkCopy.ColumnMappings.Add(cols, cols); 
       } 

       sqlBulkCopy.WriteToServer(testTable); 
      } 
      transaction.Commit(); 
     } 
     catch (Exception ex) 
     { 
      transaction.Rollback(); 
      throw ex; 
     } 
    } 

如果RELEASEDATE爲null,則它會永遠把它插入表作爲一個空字符串,而不是一個空的,是有辦法,迫使它爲空?或者將空字符串解釋爲sql批量複製中的空值?

+0

同樣的問題,讓我知道如果你找到任何解決方案。 – Mr767267

回答

1

對不起,有一個老問題。但是有幾件事情在這裏突出。使用DataTable(當FastMember讀卡器基本上被設計爲直接插入到SqlBulkCopy中時),0超時值(通常不明智)以及這裏事務的奇怪使用(BCP默認使用它自己的內部事務,如果它在任何時候都失敗,它會自動回滾)。

關於null問題,如果對象屬性的排序與數據庫中屬性的排序不匹配,則會發生這種情況。解決方案? FastMember!用它來迭代你的類屬性並構建映射。下面是你的代碼的清理版本,應該爲你工作:

using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connection"].ConnectionString)) 
using (var bcp = new SqlBulkCopy(conn)) 
using (var rd = ObjectReader.Create(myClassList)))) 
{ 
    Type type = typeof(T); 
    var accessor = TypeAccessor.Create(type); 
    var members = accessor.GetMembers(); 

    foreach (var member in members) 
    { 
     bcp.ColumnMappings.Add(new SqlBulkCopyColumnMapping(member.Name, member.Name)); 
    } 

    conn.Open(); 

    bcp.BatchSize = 10000; 
    bcp.DestinationTableName = "myTable"; 

    bcp.WriteToServer(rd); 
} 

注:這是.NET兼容的代碼,所以你可能需要調整的.NET框架遵守Type type代碼。但FastMember代碼將是相同的。