问题:我使用下面的类将 csv 文件序列化为
List<MyCsvFileType>
然后我 List<MyCsvFileType>
使用转换为数据表
我的转换为
(下面也列出)。现在的问题是,MyConvertTo 改变了列的位置,这意味着所有属性都排在所有公共变量之后。
这导致的问题是,之后我使用 SqlBulkCopy 将 DataTable 复制到数据库表中。不幸的是,SqlBulkCopy 使用列的索引而不是列名来将数据表自动映射到数据库表。
这意味着我会收到很好的错误消息,因为它试图在浮动区域字段中插入字母数字 AP_FL_CADKey(因为我的数据库表与类具有相同的布局)......
有什么方法可以获取 MyConvertTo 中字段和属性的位置吗?所以我不必更改我的数据库表(很多)或编写我自己的 BulkCopy 实现,因为我也不想手动设置数据表和数据库表之间的映射?
在最坏的情况下,通过按字段偏移量排序应该是可能的......
班级:
[FileHelpers.IgnoreFirst]
[FileHelpers.IgnoreEmptyLines]
public class MyCsvFileType
{
public string FL_CADKey;
public string FL_DWG;
public string FL_ObjID;
public string FL_Area;
public double FL_Area_double
{
get
{
if (string.IsNullOrEmpty(this.FL_Area))
return 0.0;
else
return System.Convert.ToDouble(this.FL_Area);
}
} // End Property PP_Area_double
public string AP_FL_CADKey;
public System.Guid UID
{
get
{
return System.Guid.NewGuid();
}
} // End Property UID
}
我的转换:
public static DataTable MyConvertTo(dynamic custs)
{
DataTable dt = MyCreateTable(custs);
System.Data.DataRow dr = null;
foreach (dynamic cli in custs)
{
Console.WriteLine();
Type t = cli.GetType();
dr = dt.NewRow();
foreach (System.Reflection.FieldInfo fi in t.GetFields())
{
dr[fi.Name] = fi.GetValue(cli);
}
foreach (System.Reflection.PropertyInfo pi in t.GetProperties())
{
dr[pi.Name] = pi.GetValue(cli, null);
}
dt.Rows.Add(dr);
} // Next cli
return dt;
}
public static DataTable MyCreateTable(dynamic custs)
{
DataTable table = new DataTable("Table_1");
foreach (dynamic cli in custs)
{
Console.WriteLine();
Type t = cli.GetType();
foreach (System.Reflection.FieldInfo fi in t.GetFields())
{
table.Columns.Add(fi.Name, fi.FieldType);
//Console.WriteLine(fi.Name + ": " + fi.GetValue(cli));
}
foreach (System.Reflection.PropertyInfo pi in t.GetProperties())
{
table.Columns.Add(pi.Name, pi.PropertyType);
//Console.WriteLine(pi.Name + ": " + pi.GetValue(cli, null));
}
break;
} // Next cli
return table;
}