如何将List<Person> personList转换为DBDataReader?
在下面给出的代码中,我尝试批量插入personList。我有大约500k条记录,方法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;} 发布于 2019-04-28 20:54:28
您可以使用此命令,然后使用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);
}发布于 2019-04-28 21:24:49
下面是创建表的一般方法。
还有另一种方法可以做到这一点,即创建一个继承自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);
}
}https://stackoverflow.com/questions/55890336
复制相似问题