Преобразовать список <X>в DBDataReader - PullRequest
2 голосов
/ 28 апреля 2019

Как я могу конвертировать List<Person> personList в DBDataReader?

В приведенном ниже коде я пытаюсь выполнить массовую вставку personList. У меня около 500 тыс. Записей, а метод 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 голосов
/ 28 апреля 2019

Вот общий способ создания таблицы.

Есть и другой способ сделать это, создав собственный класс, который наследуется от 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);
       }
}
0 голосов
/ 28 апреля 2019

вы можете использовать это и после этого с SqlBulkCopy вставить все данные в базу данных:

 IList<Name> list = new List<Name>();
    list.Add(new Name{ Forename="Bert", Surname="Fred"});

    list.Add(new Name { Forename = "John", Surname = "Smith" });
    DataTable table = new DataTable();
    table.Columns.Add("Forename");
    table.Columns.Add("Surname");

    foreach (Name item in list)
    {
        var row = table.NewRow();

        row["Forename"] = item.Forename;
        row["Surname"] = item.Surname;

        table.Rows.Add(row);
    }
...