Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t转换列表包含多个类到DataTable_C#_Sqlbulkcopy - Fatal编程技术网

C# Can';t转换列表包含多个类到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

我试图将列表转换为dataTable,然后将其保存到数据库中,但我遇到了一个问题。我得到一个列映射不匹配的错误

这是我的名单

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或IDataReader
ObjectReader.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);