SQL批量复制“使用ASP.NET的数据源中的Stringtypes的给定值无法转换为指定的目标列的typesdatetime”

我正在处理ASP.NET MVC4 projet,我试图通过使用SQL批量复制将数据从xlsx文件(Excel 2010文件)导出到我的数据库。 我的Excel文件只包含2列:第一个包含数字(从1到25),第二个包含字符(“a,b,c”的连续序列)

这是我如何导出数据,但我得到了错误“从数据源的typesstring的给定值不能转换为指定的目标列的types的int”

public ActionResult Bulk() { string xConnStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\maarab\Documents\BulkCopy.xlsx;Extended Properties=Excel 12.0;"; using (OleDbConnection connection = new OleDbConnection(xConnStr)) { OleDbCommand command = new OleDbCommand("Select * FROM [Sheet1$]", connection); connection.Open(); string dbConnection = ((EntityConnection)db.Connection).StoreConnection.ConnectionString; // Create DbDataReader to Data Worksheet using (DbDataReader dr = command.ExecuteReader()) { using (var bulkCopy = new SqlBulkCopy(dbConnection)) { bulkCopy.DestinationTableName = "bm_test" bulkCopy.WriteToServer(dr); //here I got the error } } return RedirectToAction("Index"); } 

任何想法是什么导致这个错误?

如果DataTable的列顺序与数据库中表定义的列顺序不同(如果这会导致types或长度不兼容), SqlBulkCopy.WriteToServer(DataTable)失败,并显示混乱的消息。 显然WriteToServer方法不会映射列名称。

我一直在抱怨这件事,直到我像这样手动下订单:

 SqlBulkCopy sbc = new SqlBulkCopy(ConnectionString, SqlBulkCopyOptions.UseInternalTransaction); sbc.DestinationTableName = "agSoilShapes"; sbc.ColumnMappings.Add("Mukey", "Mukey"); sbc.ColumnMappings.Add("Musym", "Musym"); sbc.ColumnMappings.Add("Shapes", "Shapes"); DataTable dt = new DataTable(); dt.Columns.Add("Mukey", typeof(SqlInt32)); dt.Columns.Add("Musym", typeof(SqlString)); dt.Columns.Add("Shapes", typeof(SqlGeometry)); 

感谢别人(@subsci)的意见,导致我在这个方向:)

使用EntityFramework.BulkInsert包时,我收到了类似的错误。 在这种情况下,根本原因是数据库表列和生成的模型元数据列(数据库优先)之间的订单不匹配。

DataTable列顺序和数据库表的列顺序应该是相同的。 它在更新表列的顺序后工作。