FastMember 및 Nullable 속성

c# fastmember reflection sqlbulkcopy

문제

난 fastmember를 사용하여 문제가 있는데, 어디에 내 클래스에 대한 공개 nullable 속성 (datetime)을 가지고 있지만 내가 그것을 시도하고 db에 열 값을 빈 문자열을 null이 아닌 예외가 발생합니다 열 값을 null로 만드는 방법에 대한 아이디어는 무엇입니까?

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 인 경우는 항상 null이 아닌 빈 문자열로 테이블에 저장됩니다. null이되도록 강제하는 방법이 있습니까? 또는 SQL 대량 복사에서 빈 문자열을 null로 해석 할 수 있습니까?

인기 답변

다소 오래된 질문을 해치워 죄송합니다. 그러나 여기서는 몇 가지 사실이 두드러집니다. 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 Framework 규격을 준수하는 Type type 코드를 조정해야 할 수도 있습니다. 그러나 FastMember 코드는 동일합니다.



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