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");
}

知道是什么导致了这个错误吗?

SQL大容量复制”;来自数据源的类型String的给定值不能转换为指定目标列“”的类型datetime;使用ASP.NE

如果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表的列的顺序应该相同。它在更新表列的顺序后工作。

相关文章: