将数据从excel传输到SQL

时间:2013-07-09 07:11:22

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

我创建了一个演示程序,用于将Excel文件上传到网络服务器,然后将数据从中复制到SQL服务器数据库。它工作得很好。

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”提供程序未在本地计算机上注册

请建议我该怎么做才能解决这个问题。

5 个答案:

答案 0 :(得分:1)

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

只需按照以下步骤操作:

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

  2. 单击配置管理器。

  3. 单击Active Platform下拉列表,如果x86已经存在,则选择该项,否则单击New。

  4. 从新平台下拉列表中选择x86

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

  6. 您可以按照THIS链接逐步进行图示。

答案 1 :(得分:1)

当您的应用程序的位数与安装的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。

答案 2 :(得分:1)

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

这是一个32位组件。因此,您需要将平台设置为x86。

答案 3 :(得分:0)

出现错误是因为您没有在计算机上安装Office 2007。

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

答案 4 :(得分:0)

试试这个

没有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();