3

そのワークシートの特定のセル値を確認するために 、 SSIS ScriptTaskを介して Excel ファイルを読み込もうとしています。

コード例では、strSQLが " H4:H4 " に設定され、1 つのセルのみが読み取られることがわかります。このセルは、true または false の値のみを持つことができます。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]";

ブール値の認識を失います:

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

bool 値を他の処理タスクに使用したいと思います。

B2 値を読み取ることに加えて、これを修正するにはどうすればよいですか?

4

2 に答える 2

3

IMEX=1混合データ型をテキストとして扱うようにドライバーに指示する、指定された接続文字列。(MSDN 記事「Excel 接続マネージャー」の「使用上の考慮事項」セクションを参照してください。)

したがって、単一の行を指定した場合

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

3 列目に考えられるデータ型は 1 つだけで、ドライバーはそれを正しく推測できました。ただし、複数の行を指定した場合

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

H1:H4 の範囲の値が a ではなかった場合boolドライバーはその列のすべてのstring値をs に変換しました。

実際に列 H にデータ型が混在していて、特定の 2 つのセルの値のみを気にしていると仮定すると、最も簡単な解決策は、各セルを個別にクエリすることです。その方法のアイデアについては、「単一の Excel セルを SSIS にインポートする」を参照してください。

于 2012-12-02T17:53:52.527 に答える
1

ほとんどのコードを複製して、2 つの別個の SELECT ステートメントを生成し、別個の SQL ステートメントを使用して、2 つの異なるセルをクエリします。

実際には、さらに進んで、スクリプト全体を SSIS コンポーネント (SQL タスクの実行やデータ フロー タスクなど) に分割することになるでしょう。

于 2012-12-01T11:26:57.857 に答える