本帖最后由 kenlgkl 于 2010-05-06 23:15:20 编辑

解决方案 »

  1.   

    using(OleDbConnection conn= new OleDbConnection(""))
    {   
      conn.Open();   
      DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,   
      new object[] {null, null, null, "TABLE"});   
      foreach (DataRow dr in schemaTable.Rows)   
      {   
      Console.WriteLine(dr["TABLE_NAME"]);   
      DataTable columnTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,   
      new object[] {null, null, dr["TABLE_NAME"].ToString(),null});   
      foreach(DataRow dr2 in columnTable.Rows)   
      {   
      Console.WriteLine(" {0}", dr2["COLUMN_NAME"]);   
      }   
      }   
      conn.Close();   
    }   
      

  2.   

    你获取架构时,直接指定TABLE_NAME,难道也会这样?
      

  3.   

    看看我的代码,我刚刚解决了这个问题!
     schemaTableView = myConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]{null,null,null,"Table"});
                        if (schemaTableView!= null)
                        {
                            rsResult = schemaTableView.CreateDataReader();
                            if (rsResult != null)
                            {
                                alsheetName = new ArrayList();
                                if (alsheetName != null)
                                {
                                    while (rsResult.Read())
                                    {
                                       
                                        int i=rsResult.GetString(2).IndexOf('$');
                                        if (rsResult.GetString(2).Substring(i).Length == 1)
                                        {
                                            alsheetName.Add(rsResult.GetString(2));  // Table Name;
                                            //alsheetName.Add(rsResult.GetString(2).Substring(0, i));  // Table Name;                                    }
                                       
                                        
                                    }
                                }
                                rsResult.Close();
                                rsResult = null;
                            }
                            schemaTableView = null;
                        }
      

  4.   

    谢谢sxzcg,这方法可行~,先用着,不过感觉有些地方可能不好应用这种取得表名的方法速度不是很快,像是要获取1000000条数据Excel的sheet,单单用这方法取得表名需要几分钟以上,要是数据量在大些要很久。EXCEL里面存在一张XML表用来存放SHEET表名,可以根据取得EXCEL里的XMl表取的表名,不知道怎么做。
      

  5.   

    我也遇到这种问题,发现是表中建立了筛选导致的问题,一个表是整张的,但是数据不完整  带有FilterDatabas的就是筛选区域内的所有数据了
      

  6.   

     int i = 0;
                        ////获取Excel中的Sheet名
                        foreach (DataRow row in tblSchema.Rows)
                        {
                            string name = (string)row["TABLE_NAME"];
                            //string tempName = name;
                            //if (tempName.IndexOf(" ") > -1 || tempName.IndexOf(" ") > -1)
                            //{
                            //    tempName = tempName.Replace(" ", "_");
                            //    tempName = tempName.Replace(" ", "_");
                            //    tempName = tempName.Replace("'", "");
                            //}
                            //if (!tempName.EndsWith("$"))
                            //{
                            //    continue;
                            //}
                            if (i > 0)
                            {
                                sheetNames += ',';
                            }
                            // 读取表名 
                            sheetNames += name;
                            i++;
                        }