【问题标题】:Transfer data from excel to SQL将数据从 Excel 传输到 SQL
【发布时间】:2013-07-06 16:50:54
【问题描述】:

我创建了一个演示,用于将 Excel 文件上传到 webserver,然后将数据从它复制到 SQL server db。它运行良好。

ASPX 设计:

    <table>
           <tr>
              <td>
                   <span style="color: Red">*</span>Attach Excel file
              </td>
              <td>
                   <asp:FileUpload ID="fileuploadExcel" runat="server" />
              </td>
           </tr>
           <tr>
              <td></td>
              <td>
                  <asp:Button ID="btnSend" runat="server" Text="Export" onclick="btnSend_Click"  />
              </td>
</tr>
</table>

后面的代码:

 private String strConnection = "Data Source=Test-PC;Initial Catalog=ExcelMapping;User ID=Test;Password=Test";
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        protected void btnSend_Click(object sender, EventArgs e)
        {
            //file upload path
            string path = fileuploadExcel.PostedFile.FileName;
            fileuploadExcel.SaveAs(Server.MapPath(path));
            //Create connection string to Excel work book
            string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Server.MapPath(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
            OleDbCommand cmd = new OleDbCommand("Select [lat],[long] from [Sheet1$]", excelConnection);
            excelConnection.Open();
            OleDbDataReader dReader;
            dReader = cmd.ExecuteReader();
            DataSet ds = new DataSet();

            SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection);
            //Give your Destination table name
            sqlBulk.DestinationTableName = "Test";
            sqlBulk.ColumnMappings.Add(0, 1);
            sqlBulk.ColumnMappings.Add(1, 2);
            sqlBulk.WriteToServer(dReader);
            excelConnection.Close();
        }
    }

但是当我在现有应用程序中使用相同的代码时。打开与 Excel 的连接时出现错误提示

“Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机上注册

请建议我如何解决此问题。

【问题讨论】:

  • 你说,你有一个在同一台机器上工作的示例解决方案?
  • 您是否尝试过使用 ODBC 数据源管理器添加该提供程序?
  • @nunespascal 是的,演示在同一台机器上工作。
  • @rajeem_cariazo 不,我没有,但相同的代码正在演示中工作。
  • 您是否有机会在 64 位机器上运行?众所周知,Excel OleDB 在 64 位平台上存在问题。

标签: c# asp.net .net sql-server file-upload


【解决方案1】:

您需要安装Office System Driver: Data Connectivity Components

这是一个 32 位组件。所以你需要将你的平台设置为 x86。

【讨论】:

  • 我无法将其切换到 32 位。我在 win 7 64 位上运行此应用程序。如果我为 32 位构建它,应用程序中的其他组件将停止工作。
【解决方案2】:

当您的应用程序的位数与安装的 ACE.OLEDB 提供程序不同并且通常出现在 64 位系统上时,会出现此消息

例如,您针对AnyCPU 平台进行编译,然后在 64 位系统上运行您的应用程序。在这种情况下,您的应用程序作为 64 位代码运行,但 64 位代码不能使用 32 位驱动程序。如果在您的目标系统上有一个 32 位 ACE.OLEDB,您会收到消息。当然,反过来也是如此。您的应用是 x86 编译的,但 ACE.OleDb 是 64 位的。 (不,您不能同时安装 32 位和 64 位版本的提供程序)

当然,我假设驱动程序已经安装,如果没有,您可以从Microsoft Access Database Engine 页面下载它们,但请记住,它们应该与您安装的 Microsoft Office 具有相同的位数。大问题来了。如果您安装了 32 位版本的 Office,则需要 32 位版本的数据库引擎。这意味着您需要为 x86 编译应用程序,或者您需要安装 64 位版本的 Microsoft Office。

【讨论】:

  • 我的应用是 64 位编译的。我在win 7 64位上运行它。并且构建设置为“任何 CPU”
  • 你是否安装了 32 位版本的 Office?
  • 抱歉,该版本的Office无法安装64位驱动,需要安装64位的Office
  • 您的代码与消息不一致。您使用 Microsoft.ACE.OleDb.12.0,但您的错误消息涉及 Microsoft Jet.OleDb.12.0。 (那真的不存在)你能检查一下这只是一个错字还是你实际上有这个错误?
【解决方案3】:

我曾经遇到过这个问题。我按照以下步骤操作:

只需按照以下步骤操作:

  1. 在解决方案资源管理器中右键单击解决方案文件

  2. 单击配置管理器。

  3. 单击活动平台下拉菜单,如果 x86 已经存在,则选择它,否则单击新建。

  4. 从新平台下拉菜单中选择x86

  5. 编译并运行您的应用程序。

您可以按照THIS链接一步一步的图示。

【讨论】:

    【解决方案4】:

    出现错误是因为您的机器上没有安装 Office 2007。

    因此,您需要从以下位置安装 2007 Office System 驱动程序:数据连接组件: http://www.microsoft.com/download/en/details.aspx?id=23734

    【讨论】:

    • 我安装了office 2010
    【解决方案5】:

    试试这个

    没有OLEDB ..非常简单的代码

    参考:exceldatareader.codeplex.com/

    下载dll并添加引用

    FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);
    
    //1. Reading from a binary Excel file ('97-2003 format; *.xls)
    IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
    //...
    //2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
    IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
    //...
    //3. DataSet - The result of each spreadsheet will be created in the result.Tables
    DataSet result = excelReader.AsDataSet();
    //...
    //4. DataSet - Create column names from first row
    excelReader.IsFirstRowAsColumnNames = true;
    DataSet result = excelReader.AsDataSet();
    
    //5. Data Reader methods
    while (excelReader.Read())
    {
        //excelReader.GetInt32(0);
    }
    
    //6. Free resources (IExcelDataReader is IDisposable)
    excelReader.Close();
    

    【讨论】:

      猜你喜欢
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      相关资源
      最近更新 更多