5

我正在开发一个 ASP.NET MVC4 项目,我正在尝试使用 SQL Bulk Copy 将数据从 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");
}

关于导致此错误的原因有什么想法吗?

4

4 回答 4

12

SqlBulkCopy.WriteToServer(DataTable)如果 的列顺序DataTable与数据库中表定义的列顺序不同(当这导致类型或长度不兼容时),则会失败并显示令人困惑的消息。显然该WriteToServer方法不映射列名。

于 2014-09-08T03:09:33.347 回答
8

在我像这样手动设置订单之前,我一直在抱怨这个:

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) 的评论将我引向这个方向:)

于 2015-03-16T01:58:21.027 回答
1

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

于 2017-04-04T14:38:48.083 回答
0

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

于 2017-08-21T16:17:55.653 回答