首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FastMember和可空属性

FastMember和可空属性
EN

Stack Overflow用户
提问于 2016-08-17 07:48:45
回答 1查看 1.2K关注 0票数 1

我在使用make成员时遇到了问题,在这里,我拥有类的可公共空属性(datetime),但是当我尝试将它插入db时,列值是空字符串而不是null,这会引发异常,对如何使列值为空有任何想法吗?

代码语言:javascript
复制
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是空的,那么它总是将它作为空字符串而不是空字符串放入表中,有没有办法强制它为空?还是将sql大容量副本中的空字符串解释为空字符串?

EN

回答 1

Stack Overflow用户

发布于 2017-06-19 20:20:22

很抱歉说出一个有点老的问题。但是有一些东西在这里很突出。使用DataTable (当FastMember读取器基本上设计为直接插入SqlBulkCopy时)、超时的0值(通常是不明智的)以及这里事务的奇怪用法(BCP默认使用它自己的内部事务,如果它在任何时候发生故障,它会回滚自己)。

关于null问题,如果对象属性的排序与数据库中属性的排序不匹配,则可能发生这种情况。解决方案是什么?FastMember!使用它来迭代类属性并构建映射。下面是您的代码的一个经过清理的版本,应该对您有用:

代码语言:javascript
复制
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的代码,因此您可能需要调整Type type代码以满足.NET框架的要求。但是FastMember代码将是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38990925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档