【问题标题】:C# Excel Query IssueC# Excel 查询问题
【发布时间】:2017-03-03 02:40:48
【问题描述】:

此代码可以正常工作。但是当我想改变范围时,会给出 OleDBException。

OleDbCommand dates = new OleDbCommand("SELECT date FROM ["Sheet1$A1:B150"] ", baglanti);
OleDbDataReader reader= dates.ExecuteReader();
while (reader.Read())
{
    list.Add(reader["date"]);
}

范围更改版本:

OleDbCommand dates = new OleDbCommand("SELECT date FROM ["Sheet1$A250:B350"] ", baglanti);
OleDbDataReader reader= dates.ExecuteReader();

while (reader.Read())
{
    list.Add(reader["date"]);
}

例外是:

System.Data.OleDb.OleDbException was unhandled by user code
ErrorCode=-2147217904
HResult=-2147217904
Message=No value is entered for one or more required parameters.
Source=Microsoft Access Database Engine
StackTrace:
konum:    System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
konum:   System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
konum: System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
konum: System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
konum: System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
konum: Hasta_Bulucu.Form1.bul_DoWork(Object sender, DoWorkEventArgs e) C:\Users\Furka\documents\visual studio 2015\Projects\Hasta Bulucu\Hasta      Bulucu\Form1.cs içinde: satır 269
konum: System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
konum: System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
InnerException: 

【问题讨论】:

  • 能否请您添加用于初始化 OledDbConnection 的连接字符串?
  • @andrews OleDbConnection baglanti = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePick.FileName.ToString() + ";Mode=Read;Extended Properties= 'Excel 12.0 xml;HDR=YES;IMEX=1;'");
  • @andrews 当我将范围 A1 设置为 R250 时,它包括工作表的标题,但 A150 到 R300 不包括标题。所以 sql 命令找不到列名。我需要在此选择中包含标题信息。那么该怎么做呢?

标签: c# sql excel ado.net oledb


【解决方案1】:

尝试以下方法:

在连接字符串中设置HDR=NO,如:

OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + 
                         filePick.FileName.ToString() + 
";Mode=Read;Extended Properties='Excel 12.0 xml;HDR=NO;IMEX=1;'");

还可以尝试将 IMEX 设置为 0 和 2,并尝试使用 HDR=NO 的不同组合。

当范围不包括列名时,您是对的,您可能会收到错误。因此,您需要尝试按列索引而不是名称来读取文件。

【讨论】:

  • 列索引的想法很有意义。但是我卡在了sql中。我无法按 A、B、C 等列 ID 查询 .... 我尝试 SELECT A FROM [Sheet1$] 但仍然抛出异常 (HDR=NO) @andrews
  • @FK 是的,我想过,但找不到任何样本。如果您尝试使用 R1C1 表示法怎么办?或者只是按索引查询列,例如 [1] 。也可以SELECT * 并在调试器中打开结果集并尝试查看您在其中的列/字段名称中得到什么。
  • @adrews 终于完成了。它必须是 F1 ..... Fn 不是直接列名,如 A、B 等。再次感谢。
  • @FK 不客气!您现在有足够的代表进行投票。如果您也对这个答案和我们昨天研究过的答案投票,我们将不胜感激。
  • 你明白了,享受吧:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多