【问题标题】:SqlBulkCopy not importing data from ExcelSqlBulkCopy 不从 Excel 导入数据
【发布时间】:2014-07-29 00:15:24
【问题描述】:

我正在做一个简单的项目,使用 Visual Studio 12 和 C# 将数据从 Excel 导出到 SQL Server。我设法从 Excel 导入数据集,但没有将它们插入到我的数据库中,尽管代码显示了一个积极的消息框,我已经设置它告诉我什么时候可以。

表示我的数据成功导出到SQL,但是当我选择“显示表数据”时没有显示数据;桌子是空的。这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
using System.IO;
using System.Data.OleDb;
using System.Data.Common;
using System.Data.SqlClient;

namespace testoledb    
{
   public partial class Form1 : Form
   {
      DataSet OleDs = new DataSet();
      OleDbDataAdapter OleAdapter = new OleDbDataAdapter();

      public Form1()
      {
         InitializeComponent();
      }

      private void Form1_Load(object sender, EventArgs e)
      {    
      }

      private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
      {
      }

      private void upload_excl_Click(object sender, EventArgs e)
      {
         string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
         path = Path.Combine(path, "AGENDA.xlsx");
         string path2 = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
         path2 = Path.Combine(path2, "Database1.mdf");

         string OleConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+path+@";Extended Properties='Excel 12.0 Macro;MDR=Yes;ImportMixedTypes=Text;TypeGuessRows=0'"; //,HDR=Yes;IMEX=1""";

         OleDbConnection OleConn = new OleDbConnection(OleConnectionString);    
         string OleStrCmd = "select * from [Feuil1$A1:I330]";    
         OleDbCommand OleCmd = new OleDbCommand(OleStrCmd, OleConn);

         try
         {
            OleConn.Open();
            OleDs.Clear();
            OleAdapter.SelectCommand = OleCmd;
            OleAdapter.Fill(OleDs);
            dataGridView1.DataSource = OleDs.Tables[0];

            //***************************************charger la base*******************************************************************************
            using (DbDataReader dr = OleCmd.ExecuteReader())
            {
               // SQL Server Connection String
               string sqlConnectionString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=" + path2 + ";Integrated Security=True";

               // Bulk Copy to SQL Server
               using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
               {
                  bulkCopy.DestinationTableName = "[dbo].[Table]";
                  bulkCopy.WriteToServer(dr);
                  MessageBox.Show("Data Exoprted To Sql Server Succefully");
               }
            }
                //***********************************************************************************************

         }
         catch (Exception ex)
         {
            MessageBox.Show(ex.ToString());    
         }
         finally
         {
            OleConn.Close();
         }
      }
   }
}

【问题讨论】:

  • 您必须以这种方式导入数据吗?如果没有,你应该可以很容易地使用BULK INSERT
  • 你的Table真的叫Table吗?
  • 这可能是个愚蠢的问题,但您确定没有导入数据吗?例如,您已经签入了 SSMS,但它不是吗?我只是问,因为听起来您已经编写了一个用于检索表记录的 UI,并且我想确保没有错误出现在这方面的风险。
  • 顺便说一句,我也很想在这个问题上看到一个更好的标题。如果您有答案,您将更有可能获得答案。
  • @dub stylee :不,我是初学者,我只是这样找到它,所以我尝试了如果有另一个请带我去一个好的参考。谢谢^^。

标签: c# sql excel


【解决方案1】:

要判断您是否真的在导入数据,您可以执行以下操作:

OleDBCommand commandRowCount = new SqlCommand(
            "SELECT COUNT(*) FROM " +
            "dbo.Table;",
            OleConn);
long countStart = System.Convert.ToInt32(
            commandRowCount.ExecuteScalar());

这将为您提供一开始的行数,可能为 0。然后在导入数据之后:

// Perform a final count on the destination  
// table to see how many rows were added. 
long countEnd = System.Convert.ToInt32(
            commandRowCount.ExecuteScalar());

这将为您提供结束的行数。然后您可以通过计算countEnd - countStart 来判断导入了多少行。检查OleDs.Tables[0].Rows.Count 的值也可能会有所帮助,以确保DataSet 中有行。

更多关于SqlBulkCopy.WriteToServer的信息:http://msdn.microsoft.com/en-us/library/434atets(v=vs.110).aspx

编辑:

我正在回顾您的原始代码,看起来您不需要使用DbDataReader。由于您已经将数据加载到您的DataSet,因此有一个版本的SqlBulkCopy.WriteToServerDataTable 作为参数,因此您可以试试这个:

       // SQL Server Connection String
       string sqlConnectionString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=" + path2 + ";Integrated Security=True";

       // Bulk Copy to SQL Server
       using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
       {
          bulkCopy.DestinationTableName = "[dbo].[Table]";
          bulkCopy.WriteToServer(OleDs.Tables[0]);
          MessageBox.Show("Data Exoprted To Sql Server Succefully");
       }

注意,我没有在DbDataReader 中包含外部using 块。试一试,看看它是否适合你。

【讨论】:

  • 你好,dub stylee,我已经告诉你数据库表中没有任何内容引用:“它说我的数据已成功导出到 SQL,但是当我选择“显示表数据”时没有数据显示;表格是空的。这是我的代码:"
  • 我的数据集上有行,但表中没有...请帮助,没有例外表明我做错了什么
  • 你能发布你的表的定义吗?可能是这些列与电子表格中的源列不匹配。
  • 它们是复制/过去的名称:(有没有其他方法可以让它发生而不是使用批量方法请帮助我
  • @user3820191,检查我的编辑,我添加了一种(希望)更简化的方式来写入您的数据,如果可行,请告诉我。
猜你喜欢
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多