SQL大容量复制”;来自数据源的类型String的给定值不能转换为指定目标列“”的类型datetime;使用ASP.NE
本文关键字:类型 目标 NE ASP 使用 datetime 转换 不能 数据源 复制 大容量 | 更新日期: 2023-09-27 18:23:49
我正在处理ASP.NET MVC4项目,并尝试使用SQL批量复制将数据从xlsx文件(Excel 2010文件)导出到我的数据库。我的Excel文件只包含两列:第一列包含数字(从1到25),第二列包含字符(连续的"a,b,c"系列)
这就是我试图导出数据的方式,但我得到了错误"数据源中类型为String的给定值无法转换为指定目标列的类型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
的列顺序与数据库中表定义的列顺序不同(当这导致类型或长度不兼容时),则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列的顺序和Database表的列的顺序应该相同。它在更新表列的顺序后工作。