C# Can';t转换列表包含多个类到DataTable
我试图将列表转换为dataTable,然后将其保存到数据库中,但我遇到了一个问题。我得到一个列映射不匹配的错误 这是我的名单C# Can';t转换列表包含多个类到DataTable,c#,sqlbulkcopy,C#,Sqlbulkcopy,我试图将列表转换为dataTable,然后将其保存到数据库中,但我遇到了一个问题。我得到一个列映射不匹配的错误 这是我的名单 public static class Program { static Logger _myLogger = LogManager.GetCurrentClassLogger(); public class Student { public int int { get; set; } public string name
public static class Program
{
static Logger _myLogger = LogManager.GetCurrentClassLogger();
public class Student
{
public int int { get; set; }
public string name { get; set; }
public string email { get; set; }
public string phoneNumber { get; set; }
public virtual ICollection<tblStudentCourses> tblStudentCourses { get; set; }
}
List<Student> student = new List<Student>();
错误:
给定的列映射与源或目标中的任何列都不匹配使用ObjectReader在任何集合的顶部创建IDataReader,例如:
var student = new List<Student>();
...
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(student, "Id", "Name", "Email","PhoneNumber"))
{
bcp.DestinationTableName = "SomeTable";
bcp.WriteToServer(reader);
}
var student=newlist();
...
使用(var bcp=new SqlBulkCopy(连接))
使用(var reader=ObjectReader.Create(学生,“Id”、“姓名”、“电子邮件”、“电话号码”))
{
bcp.DestinationTableName=“SomeTable”;
bcp.WriteToServer(读卡器);
}
SqlBulkCopy可以使用DataTable或IDataReaderObjectReader.Create
创建一个对象,该对象包装任何集合,并通过可与SqlBulkCopy一起使用的IDataReader接口将其公开
也可以使用LINQtoDataSet或MoreLinq的扩展方法从IEnumerable创建DataTable。但是,它们必须读取整个IEnumerable并缓存DataTable中的所有数据。如果有很多行,这可能会很昂贵
另一方面,ObjectReader不需要缓存任何内容错误
给定的列映射与源或目标中的任何列都不匹配
通常有三种原因:
- 您没有提供任何列映射,并且源中的列多于目标中的列
- 您为源提供了无效的列名
- 您为目标提供了无效的列名
- 提供一个列映射
有关此错误的更多信息可在此处找到:如果您能够读取数据表中的数据,请按如下方式更改代码
bulkCopy.DestinationTableName = "dbo.Student";
bulkCopy.ColumnMappings.Add("<list field name>", "<database field name>");
//Map all your column as above
bulkCopy.WriteToServer(dataTable);
bulkCopy.DestinationTableName=“dbo.Student”;
bulkCopy.ColumnMappings.Add(“,”);
//如上所述映射所有列
bulkCopy.WriteToServer(数据表);
我希望这能解决您的问题。您从哪里得到哪个异常?bulkCopy.WriteToServer(recipientsBulk.AsDataTable());这意味着方法中的某个地方
AsDataTable()
。这种方法在哪里?看看stackHi@JohnnyTheCoder的电话,欢迎来到SO。如果您遇到错误,那么您应该包括实际的错误消息以及任何异常堆栈信息,以便我们可以帮助您。请重新检查帖子ObjectReader
。但是我仍然认为您必须提供到SqlBulkCopy.com的ColumnMappings,因为我得到了意外的结果transaction@JohnnyTheCoder无论是使用DataTable还是数据读取器,都不能。SqlBulkCopy一次写入一个表。您必须将课程提取到单独的数据表或集合中,然后插入它们。如果通过ORM加载对象,最好不要以这种方式加载相关实体。ORM不适合批量操作我还想添加tblStudentCourses的数据。这将如何与您的解决方案配合使用?您的错误显示您的字段不匹配。。所以您需要同时映射它们..列出字段名和数据库字段名。
var student = new List<Student>();
...
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(student, "Id", "Name", "Email","PhoneNumber"))
{
bcp.DestinationTableName = "SomeTable";
bcp.WriteToServer(reader);
}
bulkCopy.DestinationTableName = "dbo.Student";
bulkCopy.ColumnMappings.Add("<list field name>", "<database field name>");
//Map all your column as above
bulkCopy.WriteToServer(dataTable);