1

我在使用 fastmember 时遇到问题,我的班级有一个公共可为空的属性(日期时间),但是当我尝试将其插入数据库时​​,列值是空字符串而不是 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;
      }
  }

如果releaseate为null,那么它将始终将其作为空白字符串而不是null放入表中,有没有办法强制它为null?或将空字符串解释为 sql 批量复制中的空值?

4

1 回答 1

1

很抱歉解决了一个有点老的问题。但这里有几件事很突出。a 的使用DataTable(当 FastMember 阅读器基本上被设计为直接推入 SqlBulkCopy 时),0超时值(通常不明智)以及这里对事务的奇怪使用(BCP 将默认使用它自己的内部事务,如果它在任何时候都会失败,它会自行回滚)。

关于 null 问题,如果对象属性的顺序与数据库中属性的顺序不匹配,则可能会发生这种情况。解决方案?快速会员!使用它来迭代您的类属性并构建映射。以下是您的代码的清理版本,应该适合您:

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 Compliant 代码,因此您可能需要调整Type type代码以符合 .NET Framework。但是 FastMember 代码是一样的。

于 2017-06-19T20:20:22.067 回答