将List <x>转换为DBDataReader

时间:2019-04-28 12:39:51

标签: c# entity-framework sqlbulkcopy dbdatareader

如何将List<Person> personList转换为DBDataReader

在下面给出的代码中,我试图批量插入personList。我有大约50万条记录,方法WriteToServer期望有一个DBDataReader,而我有一个List<Person>。如何将List<Person>转换为DBDataReader

using (SqlBulkCopy bc= new SqlBulkCopy(constr)) {
      bc.DestinationTableName = "MyPersonTable";
       try
       {
             bc.WriteToServer(personList);
       }
       catch (Exception ex)
       {
             Console.WriteLine(ex.Message);
       }
}\

\

**Person Model**

public int personId {get;set;} // Primarykey
public string personName {get;set;} 
public int personAge {get;set;} 
public DateTime personCreatedDate {get;set;} 

2 个答案:

答案 0 :(得分:1)

您可以使用此代码,然后将其与SqlBulkCopy一起将所有数据插入数据库:

null

答案 1 :(得分:0)

这是创建表的通用方法。

还有另外一种方法,通过创建自IDataReader继承的自定义类(如果您对此很感兴趣)来了解

无论如何,下面是一种方式。

public static DataTable MakeTable(this List<object> o)
{
  var data = new DataTable();
  var props = o.FirstOrDefault()?.GetType().GetProperties();
  if (props == null)
      return data;
  forEach(var p in props){
        DataColumn c = new DataColumn();
        c.DataType = p.PropertyType;
        c.ColumnName = p.Name;
        // c.AutoIncrement = true; // if this is a primaryKey 
        data.Columns.Add(c);
  }

  forEach(var item in o){
    var row = data.NewRow();
    forEach(var p in props){
     row[p.Name] = p.GetValue(item);
     }
     data.Rows.Add(row);
  }
  return data;
}
   // now all you need is to call MakeTable
   using (SqlBulkCopy bc= new SqlBulkCopy(constr)) {
      bc.DestinationTableName = "MyPersonTable";
       try
       {
             bc.WriteToServer(personList.MakeTable());
       }
       catch (Exception ex)
       {
             Console.WriteLine(ex.Message);
       }
}