C# 转换列表<;X>;到DBDataReader
如何将C# 转换列表<;X>;到DBDataReader,c#,entity-framework,sqlbulkcopy,dbdatareader,C#,Entity Framework,Sqlbulkcopy,Dbdatareader,如何将列表个人列表转换为DBDataReader 在下面给出的代码中,我正在尝试批量插入personList。我有大约500k条记录,方法WriteToServer需要一个DBDataReader,我有一个列表。如何将List转换为DBDataReader using (SqlBulkCopy bc= new SqlBulkCopy(constr)) { bc.DestinationTableName = "MyPersonTable"; try {
列表个人列表
转换为DBDataReader
在下面给出的代码中,我正在尝试批量插入personList
。我有大约500k条记录,方法WriteToServer
需要一个DBDataReader,我有一个列表
。如何将List
转换为DBDataReader
using (SqlBulkCopy bc= new SqlBulkCopy(constr)) {
bc.DestinationTableName = "MyPersonTable";
try
{
bc.WriteToServer(personList);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}\
\
您可以使用此选项,然后使用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);
}
IList list=new list();
添加(新名称{Forename=“Bert”,姓氏=“Fred”});
添加(新名称{Forename=“John”,姓氏=“Smith”});
DataTable=新的DataTable();
表.列.添加(“名称”);
表.列.添加(“姓氏”);
foreach(列表中的名称项)
{
var row=table.NewRow();
行[“Forename”]=项。Forename;
行[“姓氏”]=项。姓氏;
table.Rows.Add(行);
}
以下是创建表的一般方法
还有另一种方法可以做到这一点,即创建一个自定义类,该类继承自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);
}
}
公共静态数据表MakeTable(此列表为o)
{
var data=new DataTable();
var props=o.FirstOrDefault()?.GetType().GetProperties();
if(props==null)
返回数据;
forEach(道具中的var p){
DataColumn c=新的DataColumn();
c、 数据类型=p.PropertyType;
c、 ColumnName=p.名称;
//c.AutoIncrement=true;//如果这是primaryKey
数据。列。添加(c);
}
forEach(o中的var项){
var row=data.NewRow();
forEach(道具中的var p){
行[p.Name]=p.GetValue(项目);
}
data.Rows.Add(行);
}
返回数据;
}
//现在您只需要调用MakeTable
使用(SqlBulkCopy bc=新的SqlBulkCopy(constr)){
bc.DestinationTableName=“MyPersonTable”;
尝试
{
WriteToServer(personList.MakeTable());
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}
也许吧?乍一看,我看到它甚至提到了批量复制。我只是在我的类中粘贴了这个方法,并删除了static关键字。我得到以下错误严重性代码描述项目文件行抑制状态错误CS1106扩展方法必须在非通用静态类中定义
Yepp正如它所说的,从参数中删除此
:)我已用个人模型更新了我的帖子。我不明白如何为Person模型添加数据类型和ColumnName。请帮帮我。什么意思,数据类型和列名已经添加了。如果propertyName和DataTable与数据库中的DataTable相同,那么它应该可以工作。查看行c.ColumnName=p.PropertyName代码>这里是我分配ColumnName的地方自动递增部分是如何工作的?我这里只有personId
作为主键。如果我取消注释该行,其他字段会受到影响吗?
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);
}
}