Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用第一个值作为列标题的数据集_C#_Dataset_Oledb - Fatal编程技术网

C# 使用第一个值作为列标题的数据集

C# 使用第一个值作为列标题的数据集,c#,dataset,oledb,C#,Dataset,Oledb,我有一段代码,我想从Excel工作表的a列中提取值。现在,以下是我正在使用并遇到问题的代码: m_connString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + m_source + "; Extended properties = 'Excel 12.0; HDR = NO; IMEX = 1;';"; using (OleDbConnection conn = new OleDbConnection(m_connSt

我有一段代码,我想从Excel工作表的a列中提取值。现在,以下是我正在使用并遇到问题的代码:

m_connString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + m_source + "; Extended properties = 'Excel 12.0; HDR = NO; IMEX = 1;';";

using (OleDbConnection conn = new OleDbConnection(m_connString)) 
{

  conn.Open();
  DataTable dt = conn.GetOleDbSchemaGuid(Tables, null);
  DataSet ds = new DataSet();
  string defaultSheet = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
  OleDbCommand comm = new OleDbCommand("SELECT * FROM [" + defaultSheet + "]", conn);
  OleDbDataAdapter adapter = new OleDbDataAdapter(comm);

  // Bug appears here
  adapter.fill(ds)


  // Fill a List<string> with the data found
  for (int r = 0; r < ds.Tables[0].Row.Count; r++)
  {
    m_list.Add(ds.Tables[0].Rows[r][0].ToString();
  }

}
…我最终得到的是除第一个值(第1行)之外的所有值。结果表明,行1被用作数据集表的列名(?)。但是,我不希望有任何列名或标题,我在连接字符串中特别声明了这一点


如何防止这种行为,以便将所有数据都放在列表中?或者,如果做不到这一点,我如何解决这个问题并从该数据集中提取行1?

将sql更改为与此类似的内容

"SELECT * FROM [" + defaultSheet + "] Except  Select Top(1)"
试着这样做:

    DataTable table = ds.Tables[0];

    foreach (DataColumn column in table.Columns)
    {
        string cName = table.Rows[0][column.ColumnName].ToString();
        if (!table.Columns.Contains(cName) && cName != "")
        {
            column.ColumnName = cName;
        }
    }
检查以了解连接的扩展属性如何工作:

列标题:默认情况下,假定 Excel数据源包含可以用作字段的列标题 名字。如果情况并非如此,则必须关闭此设置,或者 第一行数据“消失”用作字段名。这是 通过将可选的HDR=设置添加到 连接字符串。默认值,不需要 如果指定,则HDR=是如果没有列标题,则需要 指定HDR=否;提供者将您的字段命名为F1、F2等。

下面是一个例子:

Excel文件数据(test.xlsx)

string m_source = "test.xlsx";    
string m_connString = @"Provider = Microsoft.ACE.OLEDB.12.0; 
                        Data Source = " + m_source + @"; 
                        Extended properties = 'Excel 12.0; 
                        HDR= NO; 
                        IMEX = 1;';";

using (OleDbConnection conn = new OleDbConnection(m_connString)) 
{
     conn.Open();         
     string squery = "SELECT f1, f2, f3 FROM [Sheet1$]"; 
     OleDbCommand comm = new OleDbCommand(squery, conn);
     OleDbDataAdapter adapter = new OleDbDataAdapter(comm);                
     DataSet ds = new DataSet();
     adapter.Fill(ds);        
}

代码

string m_source = "test.xlsx";    
string m_connString = @"Provider = Microsoft.ACE.OLEDB.12.0; 
                        Data Source = " + m_source + @"; 
                        Extended properties = 'Excel 12.0; 
                        HDR= NO; 
                        IMEX = 1;';";

using (OleDbConnection conn = new OleDbConnection(m_connString)) 
{
     conn.Open();         
     string squery = "SELECT f1, f2, f3 FROM [Sheet1$]"; 
     OleDbCommand comm = new OleDbCommand(squery, conn);
     OleDbDataAdapter adapter = new OleDbDataAdapter(comm);                
     DataSet ds = new DataSet();
     adapter.Fill(ds);        
}
数据集可视化工具

string m_source = "test.xlsx";    
string m_connString = @"Provider = Microsoft.ACE.OLEDB.12.0; 
                        Data Source = " + m_source + @"; 
                        Extended properties = 'Excel 12.0; 
                        HDR= NO; 
                        IMEX = 1;';";

using (OleDbConnection conn = new OleDbConnection(m_connString)) 
{
     conn.Open();         
     string squery = "SELECT f1, f2, f3 FROM [Sheet1$]"; 
     OleDbCommand comm = new OleDbCommand(squery, conn);
     OleDbDataAdapter adapter = new OleDbDataAdapter(comm);                
     DataSet ds = new DataSet();
     adapter.Fill(ds);        
}

我尝试在SQL命令中使用F1而不是*,但是当我尝试填充数据集时,我得到以下OLEDBEException:“没有为一个或多个必需参数提供值”。代码似乎仍然将第一行视为列标题,就像我将Excel文件的A1单元格更改为“F1”时一样,该命令工作正常。有什么建议吗?你能展示你正在使用的原始代码吗?有问题的代码似乎无效。“adapter.fill”和“datatable.Row”不应该编译。我对上述代码有一些问题。1) 为什么要创建
DataTable dt
,以及
GetOleDbSchemaGuid
的用法是什么?2) 什么是
ExcelSheets
?语法错误:1)
适配器。填充(ds)
行未以
结尾和填充应为
fill
。2)
ds.Tables[0]。行
应为
ds.Tables[0]。for循环条件中的行