0

问题:我使用下面的类将 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;
    }
4

2 回答 2

0

你不能只ColumnMappingsSqlBulkCopy实例中设置,添加基于列名的身份映射吗?

如果数据源和目标表的列数相同,并且数据源中每个源列的序号位置与相应目标列的序号位置匹配,则不需要ColumnMappings集合。但是,如果列数不同,或者序号位置不一致,则必须使用ColumnMappings确保将数据复制到正确的列中。

例如,当您添加每一列时,只需调用.Add(ColumnName,ColumnName).

于 2012-04-04T09:33:35.133 回答
0

不保证返回字段的顺序相同,尽管通常是定义的顺序。

我建议您使用 Linq 以一致的方式对返回的数组进行排序,然后使用您的转换。

于 2012-04-04T09:27:30.103 回答