3

我正在尝试通过SSIS ScriptTask读取 Excel 文件以检查该工作表中的某些单元格值。

在代码示例中,您可以看到strSQL设置为“ H4:H4 ”以仅读取一个单元格。这个单元格只能有一个真值或假值。因为我还需要检查B1中的某个字符串值,所以我想扩展这个版本。

  string filePath = "c:\\test\\testBoolean.XLSX";
  string tabName = "testSheet$";
  string strSQL = "Select * From [" + tabName + "H4:H4]";
  String strCn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
                  + filePath + ";Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1\";";
  OleDbConnection cn = new OleDbConnection(strCn);
  int iCnt = 0;
  OleDbDataAdapter objAdapter = new OleDbDataAdapter(strSQL, cn);
  DataSet ds = new DataSet();
  objAdapter.Fill(ds, tabName);
  DataTable dt = ds.Tables[tabName];

  foreach (DataRow row in dt.Rows)
  {
      iCnt = iCnt + 1;
      // some processing....
  }

我不明白为什么我用上面的strSQL语句或任何包含相同行号的语句得到一个布尔值,如下所示:

string strSQL = "Select * From [" + tabName + "F4:H4]";

调试输出:

row.ItemArray[2]    false   object {bool}

但是当我设置一个像这样的不同范围时:

string strSQL = "Select * From [" + tabName + "F1:H4]";

我失去了对 bool 值的认识:

row.ItemArray[2]   "FALSE"  object {string}

我更愿意将 bool 值用于其他处理任务。

除了读取 B2 值之外,我该如何解决这个问题?

4

2 回答 2

3

您指定的连接字符串IMEX=1,它告诉驱动程序将混合数据类型视为文本。(请参阅 MSDN 文章Excel 连接管理器的“使用注意事项”部分。)

因此,当您指定单行时

string strSQL = "Select * From [" + tabName + "F4:H4]";

第三列只有一种可能的数据类型,驱动程序能够正确推断它。但是,当您指定多行时

string strSQL = "Select * From [" + tabName + "F1:H4]";

and any value in the range H1:H4 was not a bool, the driver translated all values in that column to strings.

Assuming that you do in fact have mixed data types in column H and only care about the values in two particular cells, the simplest solution is to query each cell individually. See Import a single Excel cell into SSIS for some ideas on how to do that.

于 2012-12-02T17:53:52.527 回答
1

我将克隆大部分代码以生成两个单独的 SELECT 语句,以使用单独的 SQL 语句查询您所在的两个不同的单元格。

实际上,我可能会更进一步,将整个脚本分解为 SSIS 组件,例如执行 SQL 任务或数据流任务。

于 2012-12-01T11:26:57.857 回答