首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OleDbDataReader对象无法读取文件

OleDbDataReader对象无法读取文件
EN

Stack Overflow用户
提问于 2014-10-15 12:05:38
回答 2查看 1.1K关注 0票数 0

我开发了一个功能,在这里我将Excel工作表导入到表中。但是当我上传文件并点击要导入的按钮时。代码不起作用,给出了下面提到的错误。我试过使用DataAdapter,但这也不起作用。请参阅以下错误:

Microsoft数据库引擎找不到对象“TableName”。确保该对象存在,并确保正确拼写其名称和路径名。

此外,请参阅代码以供参考:-

代码语言:javascript
复制
 private void ImporttoSQL(string sPath)
{  
    string sSourceConstr1 = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\AgentList.xls; Extended Properties=""Excel 8.0;HDR=YES;""", sPath);
    string sSourceConstr = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES;""", sPath);
    OleDbConnection sSourceConnection = new OleDbConnection(sSourceConstr);
    using (sSourceConnection)
    {
        string sql = string.Format("Select [Merchant_Name],[Store_Name],[Store_Address],[City] FROM [MerchantTempDetail]", "Sheet1$");
        OleDbCommand command = new OleDbCommand(sql, sSourceConnection);
        sSourceConnection.Open();
        conn.Open();
        using (OleDbDataReader dr = command.ExecuteReader())
        {
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
            {
                bulkCopy.DestinationTableName = "MerchantTempDetail";
                //You can mannualy set the column mapping by the following way.
                //  bulkCopy.ColumnMappings.Add("Mini_Category_Id", "Mini_Category_Id");
                //bulkCopy.ColumnMappings.Add("CategoryId", "CategoryId");
                bulkCopy.ColumnMappings.Add("Merchant_Name", "Merchant_Name");
                bulkCopy.ColumnMappings.Add("Store_Name", "Store_Name");
                bulkCopy.ColumnMappings.Add("Store_Address", "Store_Address");
                bulkCopy.ColumnMappings.Add("City", "City");
                bulkCopy.WriteToServer(dr);
            }
        }
    }
}

编辑代码:-

代码语言:javascript
复制
 public static void ExcelToSqlServerBulkCopy()
{
    // Connection String to Excel Workbook
    // Jet4
    string excelConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=AgentList.xls; Extended Properties=""Excel 8.0;HDR=YES;""";
    // Ace Ole db 12
    string excelAceOleDb12ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=AgentList.xls;Extended Properties=""Excel 8.0;HDR=YES;""";

    // Create Connection to Excel Workbook
    using (OleDbConnection connection = new OleDbConnection(excelAceOleDb12ConnectionString))
    {
        OleDbCommand command = new OleDbCommand("Select [Merchant_Name],[Store_Name],[Store_Address],[City] FROM [Sheet1$]", connection);
        // open excel
        connection.Open();
        // Create DbDataReader to Data Worksheet
        using (DbDataReader dr = command.ExecuteReader())
        {
            // SQL Server Connection String
            string sqlConnectionString = ConfigurationManager.ConnectionStrings["DefaultSQLConnectionString"].ConnectionString;
            // Bulk Copy to SQL Server
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
            {
                bulkCopy.DestinationTableName = "MerchantTempDetail";
                bulkCopy.WriteToServer(dr);
            }
        }
    }
}

protected void btnImport_Click(object sender, EventArgs e)
{
    if (FileUpload1.HasFile)
    {
        string sPath = Server.MapPath(FileUpload1.FileName);
        FileUpload1.SaveAs(sPath);

        ExcelToSqlServerBulkCopy();
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-15 15:40:39

最后通过调试解决了问题。

代码语言:javascript
复制
 private void ImporttoSQL(string sPath)
{
    string sSourceConstr1 = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\AgentList.xls; Extended Properties=""Excel 8.0;HDR=YES;""", sPath);
    string sSourceConstr = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES;""", sPath);

    //   string sSource = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sPath + ";Extended Properties=Excel 8.0", sPath);

    // string sDestConstr = ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString;
    OleDbConnection sSourceConnection = new OleDbConnection(sSourceConstr);
    using (sSourceConnection)
    {
        SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultSQLConnectionString"].ConnectionString);
        string sql = "Select [Merchant_Name],[Store_Name],[Store_Address],[City] FROM [Sheet1$]";
        OleDbCommand command = new OleDbCommand(sql, sSourceConnection);
        sSourceConnection.Open();
        conn.Open();
        using (OleDbDataReader dr = command.ExecuteReader())
        {
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
            {
                bulkCopy.DestinationTableName = "MerchantTempDetail";
                bulkCopy.ColumnMappings.Add("Merchant_Name", "Merchant_Name");
                bulkCopy.ColumnMappings.Add("Store_Name", "Store_Name");
                bulkCopy.ColumnMappings.Add("Store_Address", "Store_Address");
                bulkCopy.ColumnMappings.Add("City", "City");
                 bulkCopy.WriteToServer(dr);
            }
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2014-10-15 13:54:04

您需要定义两个连接,一个用于Excel源,另一个用于大量复制到的sql数据库。(此代码已经过测试)如果需要复制到内存中的数据表,请使用此MSDN示例

代码语言:javascript
复制
public static void ExcelToSqlServerBulkCopy ()
{
  // Connection String to Excel Workbook
  // Jet4
  string excelConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=AgentList.xls; Extended Properties=""Excel 8.0;HDR=YES;""";
  // Ace Ole db 12
  string excelAceOleDb12ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=AgentList.xls;Extended Properties=""Excel 8.0;HDR=YES;""";

  // Create Connection to Excel Workbook
  using (OleDbConnection connection = new OleDbConnection(excelAceOleDb12ConnectionString))
  {
    OleDbCommand command = new OleDbCommand("Select [Merchant_Name],[Store_Name],[Store_Address],[City] FROM [AgentList$]", connection);
    // open excel
    connection.Open ();        
    // Create DbDataReader to Data Worksheet
    using (DbDataReader dr = command.ExecuteReader ())
    {
      // SQL Server Connection String
      string sqlConnectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=StackOverflow;Integrated Security=True";
      // Bulk Copy to SQL Server
      using (SqlBulkCopy bulkCopy = new SqlBulkCopy (sqlConnectionString))
      {
        bulkCopy.DestinationTableName = "Q26382169";
        bulkCopy.WriteToServer (dr);
      }
    }
  }
}

使用上面的变量名非常重要的细节:

  1. 您要复制到的数据库(StackOverflow)必须事先创建。
  2. 目标表(Q26382169)必须存在于该数据库中,DDL琐碎,列与您的Excel文件相同。
  3. 由于您使用的是HDR=YES选项,第一行的Excel工作表必须包含指定的列名: Merchant_Name、Store_Name、Store_Address、City (不含[])
  4. OleDbCommand中工作表的名称(AgentList$)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26382169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档