【问题标题】:how to set up auto mapping in sqlbulkcopy如何在 sqlbulkcopy 中设置自动映射
【发布时间】:2013-11-18 10:17:55
【问题描述】:

在我们的项目中我们使用的是Linq2SQL,但是现在我们需要有可能在数据库表中快速插入近15k行,所以我写了一个扩展方法:

public static void BulkInsertBigData(Table<Maintenance> maintenance, IEnumerable<Maintenance> maintenancesToInsert)
    {

            using (var copy = new SqlBulkCopy(maintenance.Context.Connection.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.KeepNulls))
            {
                //copy.ColumnMappings.Add("Id", "Id");
                //copy.ColumnMappings.Add("FacilityId", "FacilityId");
                //copy.ColumnMappings.Add("ParentFacilityId", "ParentFacilityId");
                //copy.ColumnMappings.Add("StartTime", "StartTime");
                //copy.ColumnMappings.Add("EndTime", "EndTime");
                //copy.ColumnMappings.Add("ExpirationTime", "ExpirationTime");
                //copy.ColumnMappings.Add("DispatcherUserName", "DispatcherUserName");
                copy.DestinationTableName = "dbo.Maintenance";
                var data = maintenancesToInsert.ToDataTable();
                copy.WriteToServer(data);
            }

    }

Maintanance 是自动生成的 Linq2SQL 类。当我取消注释 ColumnMappings 行时,此代码效果很好,但它们不适合,因为如果有人更改 dbml,此代码将不起作用(此代码不灵活 :))。 ToDataTable()是一种基于反射的方法,将维护列表转换为数据表。

如果有任何帮助,我将不胜感激

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

    怎么样:

    public static void BulkInsertBigData<T>(Table<T> definition, IEnumerable<T> rows)
    {
        using (var copy = new SqlBulkCopy(definition.Context.Connection.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.KeepNulls))
        {
            var meta = definition.Context.Mapping.GetMetaType(typeof(T));
            foreach (var col in meta.DataMembers)
            {
                copy.ColumnMappings.Add(col.Member.Name, col.MappedName);
            }
            copy.DestinationTableName = meta.Table.TableName;
            var data = rows.ToDataTable();
            copy.WriteToServer(data);
        }
    }
    

    甚至更好:通过FastMember取消DataTable

    public static void BulkInsertBigData<T>(Table<T> definition, IEnumerable<T> rows)
    {
        using (var copy = new SqlBulkCopy(definition.Context.Connection.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.KeepNulls))
        {
            var meta = definition.Context.Mapping.GetMetaType(typeof(T));
            var members = new List<string>(meta.DataMembers.Count);
            foreach (var col in meta.DataMembers)
            {
                copy.ColumnMappings.Add(col.Member.Name, col.MappedName);
                members.Add(col.Member.Name);
            }
            copy.DestinationTableName = meta.Table.TableName;
            using (var reader = ObjectReader.Create(rows, members.ToArray()))
            {
                copy.WriteToServer(reader);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-29
      • 2019-02-17
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      相关资源
      最近更新 更多