![](/img/trans.png)
[英]SQlBulkCopy The given value of type DateTime from the data source cannot be converted to type int of the specified target column
[英]SQL Bulk Copy “The given value of type String from the data source cannot be converted to type datetime of the specified target column” using ASP.NET
我正在研究ASP.NET MVC4项目,我正在尝试使用SQL批量复制将数据从xlsx文件(Excel 2010文件)导出到我的数据库。 我的Excel文件只包含2列:第一列包含数字(从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 Columns顺序和Database表的列顺序应该相同。 它更新了表列的顺序后起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.