2016-08-17 11 views
1

私は私のクラスのためのpublic nullableプロパティ(datetime)を持っていますが、私がしようとし、dbに列の値を挿入しようとすると空の文字列ではない例外がスローされる原因となるnullは、列の値をnullにする方法に関するアイデアですか? RELEASEDATEが、それは常に空の文字列ではなくNULLとしてテーブルにそれを置く、その後nullの場合FastMemberとnullableプロパティ

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; 
     } 
    } 

、nullにすることを強制する方法はありますか?空の文字列をSQLの一括コピーでヌルとして解釈するのか?

+0

同じ問題がある場合は、解決策が見つかった場合はお知らせください。 – Mr767267

答えて

1

多少古い質問を申し訳ありません。しかしここではいくつかのことが際立っています。 DataTable(FastMemberリーダーが基本的にSqlBulkCopyに直接スクロールされるように設計されている場合)、0タイムアウト値(一般的には賢明ではない)、そしてトランザクションの奇妙な使用(BCPはデフォルトでそれ自身の内部トランザクションを使用します)いずれかの時点で失敗した場合は、それ自体をロールバックします)。

ヌル問題に関しては、オブジェクトプロパティの順序がデータベース内のプロパティの順序と一致しない場合に発生する可能性があります。ソリューション? 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 Frameworkに準拠するためType typeコードを微調整する必要があるかもしれません。しかし、FastMemberコードは同じになります。

関連する問題