- PR -

[VB.NET]WindowsフォームからのDTSパッケージの実行

投稿者投稿内容
まさ1973
会議室デビュー日: 2004/07/27
投稿数: 11
投稿日時: 2004-08-03 11:34
お世話になります。
まさ1973です。

環境:VB.NET 2003
   SQL Server 2000

SQLServer2000のDTSインポート/エクスポート定義をVisualBasicファイルへ出力し、そのファイルをVB.NETのプロジェクトへ追加しました。

すると
Public goPackageOld As New DTS.Package
Public goPackage As DTS.Package2
の箇所で
”名前空間のステートメントが無効です。”というエラーが発生します。
VB.NETでDTSの参照はできるのでしょうか?
できるとすればどのような定義方法をすればいいのでしょうか?

パッケージを指定して実行するバッチファイルを作成して実行する方法でできそうな感じはするのですが、できればVB.NETのソースで管理したいです。

どうぞ、よろしくお願いします。

まさ1973
会議室デビュー日: 2004/07/27
投稿数: 11
投稿日時: 2004-08-03 22:35
まさ1973です。

とりあえずは、
後の方法(DTSをコマンドラインでコールするバッチファイルを実行する)で
対処するようにしてます。

引き続き、SQLServer2000で作成した出力ソースをVB.NETで活用する方法があれば(不可能であれば不可能でもかまいませんので)教えてください。
よろしくお願いします。<(_ _)>
atok
常連さん
会議室デビュー日: 2004/05/11
投稿数: 32
お住まい・勤務地: TOKYO
投稿日時: 2005-05-13 16:29
こんにちわ。
私もVB.NETから、DTSを実行したいと思うのですが、
(私の場合は、VB.NETのWEBフォームからです。。)
情報が見つかりませんでした。
どなたかご存知の方は、ご教授下さい。
よろしくおねがいします。
atok
常連さん
会議室デビュー日: 2004/05/11
投稿数: 32
お住まい・勤務地: TOKYO
投稿日時: 2005-05-13 18:20
1つ情報を見つけました。

Microsoft サポートオンラインに
[HOWTO] Visual Basic .NET での DTS パッケージ イベントの使用方法
http://support.microsoft.com/default.aspx?scid=kb;ja;321525
が公開されていました。

記事を参照しましたが、難しくあまり理解が出来ませんでした。。

文中のサンプルに
1.Visual Studio .NET を開いて新規の Visual Basic コンソール アプリケーション プロジェクトを作成し・・・
とあるので、Windowsフォームでのみ使用可能と思います。

私は、
2.DTSPackage Object (COM) Library への参照を追加が出来ず、前に進めません。。
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2005-05-13 19:31
プロジェクトの参照設定に、Microsoft DTSPackage Object Library への参照を追加していますでしょうか?

ソリューションエクスプローラの該当プロジェクトの参照設定のフォルダ内にDTSがあるか確認してください。

ない場合は、参照設定のフォルダを右クリック-参照の追加-COMタブ-Microsoft DTSPackage Object Library を選んで選択を押して、OKをおします。
参照設定が追加されてエラーにならないと思います。
atok
常連さん
会議室デビュー日: 2004/05/11
投稿数: 32
お住まい・勤務地: TOKYO
投稿日時: 2005-05-16 17:20
えムナウさん、お返事ありがとうございます。

>プロジェクトの参照設定に、Microsoft DTSPackage Object Library への参照を追加して
>いますでしょうか?
参照の追加をしていませんでした。。すみません。
追加をするとエラーが無くなりました。ありがとうございます。

上記サイトを参考に、下記のようなロジックを作成してみたのですが、
処理を実行しても何も起こらず、はまっています。。
(処理をかなり削りました)

Imports System.Runtime.InteropServices
Imports DTS

Public Class WebForm1
Inherits System.Web.UI.Page

ボタン1クリック時処理開始
Dim pkg As DTS.Package
pkg = New DTS.Package

pkg.LoadFromSQLServer("SQLサーバ名", "ユーザ名", "パス", _
DTSSQLServerStorageFlags.DTSSQLStgFlag_Default, _
"", "", "", "DTSパッケージ名", Nothing)

pkg.Execute()
pkg.UnInitialize()
pkg = Nothing
処理終了

引き続き、調査中ですが
ご存知の方がいらっしゃいましたら、ご教示の程よろしくお願いいたします。
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2005-05-16 17:59
こんにちは。
C#ですが、下記のコードで動いています。
他にPackageEventsSinkクラスが必要ですが、
引用:

atokさんの書き込み (2005-05-13 18:20) より:
[HOWTO] Visual Basic .NET での DTS パッケージ イベントの使用方法
http://support.microsoft.com/default.aspx?scid=kb;ja;321525


に載っているコードの Console.Writeline 部分をWeb向けになんとかしてやればそのまま使えるはずです。

public void RunDts(string _strSetverName, string _strServerUserName, string _strServerUserPass, string _strPackageName)
{
Package2Class package;

string strSetverName = _strSetverName;
string strServerUserName = _strServerUserName;
string strServerUserPass = _strServerUserPass;
string strPackageName = _strPackageName;

try
{
package = new Package2Class();
UCOMIConnectionPointContainer CnnctPtCont = (UCOMIConnectionPointContainer) package;
UCOMIConnectionPoint CnnctPt;
PackageEventsSink PES = new PackageEventsSink ();
// PackageEvents インターフェイスの UUID
Guid guid = new Guid("10020605-EB1C-11CF-AE6E-00AA004A34D5");
CnnctPtCont.FindConnectionPoint(ref guid, out CnnctPt);
int iCookie;
CnnctPt.Advise(PES, out iCookie);
object pVarPersistStgOfHost = null;
package.LoadFromSQLServer(strSetverName, strServerUserName, strServerUserPass,
DTSSQLServerStorageFlags.DTSSQLStgFlag_Default, null,
null, null, strPackageName, ref pVarPersistStgOfHost);

package.Execute();
package.UnInitialize();
package = null;
}

catch(System.Runtime.InteropServices.COMException ex)
{
throw ex;
//Console.WriteLine("COMException {0}\\\\n{1}\\\\n{2}", ex.ErrorCode, ex.Message, ex.StackTrace);
}
catch(System.Exception ex)
{
throw ex;
//Console.WriteLine("Exception\\\\n{0}\\\\n{1}", ex.Message, ex.StackTrace);
}
}
atok
常連さん
会議室デビュー日: 2004/05/11
投稿数: 32
お住まい・勤務地: TOKYO
投稿日時: 2005-05-17 12:45
ueさん、お返事ありがとうございます。
下記の場所がうまくいかず、処理が行われない状態です。

※ueさんから頂いたアドバイス通り、PackageEventsSinkも追加しています。
 (Console.WriteLine部はWebでは使用できないのでコメント化していますが。。)

ueさんのソースで
 int iCookie;
 CnnctPt.Advise(PES, out iCookie);
の部分を通った後、
 catch(System.Exception ex)
へ移動してしまい、
肝心な「package.LoadFromSQLServer...」
の処理が行われません。。

.netのヘルプを参照してみると
「コネクション ポイントと呼び出し元のシンク オブジェクト間に
アドバイザリ コネクションを確立します。」とありました。
WEBアプリの場合は必要ないのでしょうか?

私のソースは下記のようにしています。
 Dim intCookie As Integer
 cpPoint.Advise(PES, intCookie)
 ...
 Catch exc As Exception

ちなみに、この部分をコメント化して処理も行ってみましたが、
データは変わりませんでした。

よろしければ、ご教示の程よろしくお願いします。

スキルアップ/キャリアアップ(JOB@IT)