我有一个填充了大量数据和超过一百列的列表。我必须将整个列表转换为DataTable并使用SQLBulkCopy
批量插入数据库中的所有数据。
除了某些字段可能为空外,一切都还可以。由于某些原因,一些空字段在转换为DataTable和SQLBulkCopy
插入期间会导致一些格式异常。在一些R& D之后,我发现将空字段转换为NULL可以解决使用SQLBulkCopy
批量插入的问题。
在将列表转换为DataTable之前,有没有什么方法可以使用LINQ在列表中查找空字段并将它们转换为NULL或DBNULL?
即使我要将列表转换为DataTable,但我不想循环每一行和每个单元格来检查单元格是否为空并转换为null,因为它会在数据时影响性能很多太过分了。
答案 0 :(得分:1)
您已经循环遍历每个列/行组合以转换为DataTable
,您可以向该函数添加新参数,Func<object, object>
您在每个单元格上执行在该函数中,您检查该值是否为空,因此将其替换为 NULL
public DataTable ConvertToDataTable<T>(List<T> list, Func<object, object> transform)
{
// logic
object value = getUsingReflaction(); // ignore for now
if(transform != null)
value = transform(object);
// continue
}
用法:
ConvertToDataTable(myList, o =>
{
if (o is string && (string)o == String.Empty)
return DBNull.Value;
else return o;
});
答案 1 :(得分:1)
我只能回答第一部分,你可以使用条件语句将所有空字符串字段替换为Null值
public class Person
{
public string Sex { get; set; }
public string Name { get; set; }
}
private static void LinQ3()
{
var namesList = new List<Person>();
namesList.Add(new Person() { Sex = "M", Name = "Jonh" });
namesList.Add(new Person() { Sex = "F", Name = string.Empty });
namesList.Add(new Person() { Sex = "M", Name = string.Empty });
var nullV = namesList.Select(x => new {
Sex=x.Sex,
nullableName= string.IsNullOrWhiteSpace(x.Name)?null: x.Name
});
}
这将返回一个列表(nullV),其中字段为&#34; Name&#34;将包含字段名称上每个空值的空值。 此外,您必须使用相同的条件语句
声明要转换空字符串的每个字段