SSIS で Shift_JIS で表現できない文字(文字コード)を含む CSV ファイルの読み書き

かなりピンポイントなメモです。

【読み込み】

Shift_JISで扱えない文字を Shift_JIS で保存するわけにはいかないので、通常は Unicode の形式で保存します。SSIS のフラット ファイル ソースでは Unicode ファイルの読み込みに対応しており、フラット ファイル接続マネージャーで「Unicode」にチェックを入れることによって読む込むことができます。Unicode といってもいくつか形式はありますが、「UTF-8」「UTF-16LE」での読込は確認しています。

【書き出し】

フラット ファイル変換先で Shift_JISに対応していない文字を Shift_JIS で書き出そうとすると必ずエラーになります。事前に Shift_JIS に対応していない文字を変換するか、Unicode などで保存する必要があります。

]]>

別コンピューターから SSIS パッケージを実行する方法

メモです。SQL Server エージェントを登録する方法のプログラムで実行できました。

開発サーバーにしか SQL Server が入ってなく、SSIS パッケージもそこでしか実行できないので SQL Server エージェントに実行を任せています。

手順を簡単に書くと、

  1. SSIS プロジェクトでパッケージを作成
  2. SQL Server Management Studio から SQL Server データベース に接続し、SQL Server エージェント を起動 (今後常に使う場合は OS 起動時に常に起動させる設定にしておくといいです。)
  3. ジョブを作成し、ステップに SSIS パッケージ実行を追加。今回 SSIS パッケージはサーバー内のローカルフォルダにおいてあるので ファイル システムから SSIS パッケージを選択しました。
  4. ジョブを登録したら上記リンク先にあるプログラムでバッチ プログラムを作成。接続文字列やパッケージ名は環境に合わせて変えてください。(「jobConnection = new SqlConnection("Data Source~」の部分と「jobParameter.Value = "RunSSISPackage";」の部分)
  5. 後は実行して動作するか確認
]]>

SQL Server 構成マネージャー を起動しようとするとエラーが発生して起動できない対処法

64 bit 環境で SQL Server に関連するソフトウェアのインストールやアンインストールを繰り返していると SQL Server 構成マネージャー を起動しようとしたときに

----------------------------------------------------------------------
WMI プロバイダーに接続できません。権限がないかサーバーにアクセスできません。SQL Server 2005 以降のサーバーは、SQL Server 構成マネージャーでのみ管理できます。
無効なクラスです [0x80041010]
-------------------------------------------------------------------------

image

と表示されて起動できなくなってしまう場合があります。対処法についてはマイクロソフトの公式サイトに載っています。

基本的には上記リンク先のコマンドを管理者権限で起動したコマンド プロンプトで入力すればいいのですが、どうもパスが間違っているらしく、以下のように修正する必要があります。(もちろんインストールしたときのフォルダ設定によってパスが変わる可能性もあります。)

  • 誤:mofcomp "%programfiles(x86)%MicrosoftMicrosoft SQL Server100Sharedsqlmgmproviderxpsp2up.mof"
  • 正:mofcomp "%programfiles(x86)%Microsoft SQL Server100Sharedsqlmgmproviderxpsp2up.mof"

image

]]>

[VBScript][VBA] セルの入力項目にエラーがあるかどうかをチェックする

メモです。

通常セルに入力されている値を取得する場合は

<なんちゃら>.Cells(row, col).Value

で取得できますが、セルの入力項目にエラーがある場合、上記のプログラムでアクセスするとエラーになってしまいます。

セルの内容がエラーであるかどうかは以下のようにして事前にチェックすることができます。


Set objExcel = CreateObject("Excel.Application")
Set objSheet = <なんちゃら>
If objExcel.WorksheetFunction.IsError(objSheet.Cells(row, col)) Then
  ' エラーがあった場合の処理
Else
  ' エラーがなかった場合の処理
End If
]]>

[VBScript][VBA] Excel で入力されている一番下の行位置と一番右の列位置を取得する

メモです。

行位置

ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row

列位置

ActiveSheet.UsedRange.Columns(ActiveSheet.UsedRange.Columns.Count).Column

.NET Framework で Microsoft.Office.Interop.Excel を使う場合でも同様に取得できます。

]]>

Excel オブジェクトから結合されたセルの値を取得する

Excel で「A1」から「B2」の4セルが結合され値が設定されている場合に、Cells プロパティから4セルどこを指定しても値を取りたいと思うことがあると思いますが、実際に値の愛っているセルは結合されたセルの一番左上のセルのみであるため、ほかの位置を指定すると空の値が返ります。

【例】

A1:B2の結合セルに「10」が入力されていた場合

  • sheet.Cells(1, 1) ⇒ 10
  • sheet.Cells(1, 2) ⇒ “”
  • sheet.Cells(2, 1) ⇒ “”
  • sheet.Cells(2, 2) ⇒ “”

結合セルのどこを指定しても値を取得したい場合は「MergeArea」プロパティを使うと有効です。MergeArea.Cells の位置は必ず (1, 1)にして値が必ず存在するセルを指定します。

【例】

value = sheet.Cells(2, 2).MergeArea.Cells(1, 1).Value   ‘ = 10

]]>

DCOM を使用して Excel を実行する際の実行ユーザーアカウントを強制的に変更する

【概要】

通常 DCOM を使用して Excel オブジェクトを扱った場合、Excel の実行権限はプログラムを実行したユーザーの権限になります。Administrators で実行した場合は Administrators、Users 権限であれば Users, IIS から起動した場合は IIS ユーザー(IIS のバージョンや設定によって名前が変わるので IIS ユーザーとします)となります。

しかし、プログラムの実行ユーザーによって権限がないために本来使用したい機能があったとしても使用できずにエラーになってしまう場合があります。そういう場合は DCOM の実行権限を強制的に特定のユーザーの権限にしてしまう方法があります。

ただし、一般ユーザーであるにもかかわらず Administrators 権限で実行させることもできてしまいますので、セキュリティ観点で十分に注意する必要があります。

【手順】

  1. スタートメニューのプログラムとファイルの検索入力で「dcomcnfg」と入力して「dcomcnfg.exe」を実行
  2. 「コンポーネント サービス」⇒「コンピューター」⇒「マイ コンピューター」⇒「DCOMの構成」を展開し、「Microsoft Excel Application」を右クリックし、「プロパティ」を選択
  3. プロパティが開いたら「ID」タブを選択し、ユーザーから「このユーザー」を選択、実行したときに与える権限を持つユーザーとパスワードを入力
]]>

IIS 実行ユーザーで DCOM を使用して Excel を扱う方法 (Windows Server 2008, 2008 R2)

Windows Server 2008 や Windows Server 2008 R2 で ASP.NET プログラムから DCOM を使用して Excel を扱おうとしてもエラーがでて Excel を扱うことができません。これは IIS 実行ユーザーが Excel を使用するために必要なフォルダが Windows Server 2008, 2008 R2 に存在しないために発生する問題です。

IIS の実行ユーザーに依存するので、ASP.NET から直接 Excel を扱う場合や、ASP.NET から起動したプログラム(exe, bat, vbs 等)すべてに影響します。ちなみに Windows Server 2003, 2003 R2 ではフォルダが存在するためこの問題は発生しません。

 

この問題を回避するためには以下の箇所にフォルダを作成する必要があります。

 

[Windows Server が 32bit の場合] 、または [Windows Server が 64bit かつ Office が 64bit の場合]

  • C:WindowsSystem32configsystemprofileDesktop

Windows Server が 64bit かつ Office が 32bit の場合

  • C:WindowsSysWOW64configsystemprofileDesktop
]]>