【问题标题】:SQL Bulk Copy with Excel to SQL Server but with data modifications使用 Excel 将 SQL 大容量复制到 SQL Server,但需要修改数据
【发布时间】:2012-02-08 03:05:17
【问题描述】:

我正在阅读SQLBulkCopy,并希望使用它将数千行从 Excel 文档导入 SQL Server。我一直在阅读直接执行此操作而不修改数据的文章。在执行SQLBulkCopy 之前,我需要对 Excel 文档中的数据进行一些修改和验证。是否有可能做到这一点?我会假设从重载中我可以修改数据并创建一个大的DataTable,然后用WriteToServer 导入那个DataTable

【问题讨论】:

    标签: sql-server excel sqlbulkcopy


    【解决方案1】:

    您可能需要一个 DataReader 或 DataSet,您可以在导入之前对其进行迭代以进行验证/修改。

    此实用程序可能会对您有所帮助 - http://exceldatareader.codeplex.com/

    【讨论】:

    • 所以看起来可以在导入之前对文件进行验证。
    • 是的,我自己使用我自己的 DataSet 提供程序完成了这项工作,尽管这个工具应该有助于简化它。验证后,您可以使用相同的 DataSet 表执行导入,也可以使用单独的 SqlBulkCopy 直接处理文件。
    • 谢谢。如果批量插入失败,没有办法找出出错的行吗?
    • 我认为 SQL 错误不会包含该行。但是,您可以通过以下两种方式之一来推断它。 1)将批量插入包装在一个事务中,如果失败,在回滚前检查目标表,看看有多少行插入成功(错误会在下一行)。 2) 将 NotifyAfter 属性设置为 1,并设置 SqlRowsCopied 回调以跟踪处理的行。如果发生错误,它将在最后一个处理后的行上。有关详细信息,请参阅此页面 - msdn.microsoft.com/en-us/library/…
    【解决方案2】:

    这对我来说很好用:

        public ActionResult Create(HttpPostedFileBase file)
        {
            string strConnection = ConfigurationManager.ConnectionStrings["dbconnection"].ConnectionString;
    
            //file upload path
            var fileName = Path.GetFileName(file.FileName);
            // store the file inside ~/App_Data/uploads folder
            var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
            file.SaveAs(path);
    
            //Create connection string to Excel work book
            string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;Persist Security Info=False";
            //Create Connection to Excel work book
            OleDbConnection excelConnection = new OleDbConnection(excelConnectionString);
            //Create OleDbCommand to fetch data from Excel
            excelConnection.Open();
            DataTable dt = new DataTable();
    
            dt = excelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            if (dt == null)
            {
                return null;
            }
    
            String[] excelSheets = new String[dt.Rows.Count];
            int t = 0;
            //excel data saves in temp file here.
            foreach (DataRow row in dt.Rows)
            {
                excelSheets[t] = row["TABLE_NAME"].ToString();
                t++;
            }
    
            OleDbConnection excelConnection1 = new OleDbConnection(excelConnectionString);
    
            string query = string.Format("SELECT * FROM [{0}]", excelSheets[0]);
    
            OleDbCommand cmd = new OleDbCommand(query, excelConnection);
            //excelConnection.Open();
            OleDbDataReader dReader;
            dReader = cmd.ExecuteReader();
            SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection);
            //Give your Destination table name
            sqlBulk.DestinationTableName = "[FSM].[DFS_Akustik]";
            sqlBulk.WriteToServer(dReader);
            excelConnection.Close();
    
            ViewBag.view_dfs_akustik = dbman.View_DFS_Akustik.ToList();
            return View();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多