我在使用make成员时遇到了问题,在这里,我拥有类的可公共空属性(datetime),但是当我尝试将它插入db时,列值是空字符串而不是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是空的,那么它总是将它作为空字符串而不是空字符串放入表中,有没有办法强制它为空?还是将sql大容量副本中的空字符串解释为空字符串?
发布于 2017-06-19 20:20:22
很抱歉说出一个有点老的问题。但是有一些东西在这里很突出。使用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的代码,因此您可能需要调整
Type type代码以满足.NET框架的要求。但是FastMember代码将是相同的。
https://stackoverflow.com/questions/38990925
复制相似问题