【发布时间】:2010-11-01 17:20:22
【问题描述】:
如何从 VB.net 应用程序调用 DTS?
【问题讨论】:
-
什么是 DTS?你能再详细点吗?
-
DTS = 数据转换服务(用于 SQL Server 企业管理器)
标签: sql vb.net sql-server-2000
如何从 VB.net 应用程序调用 DTS?
【问题讨论】:
标签: sql vb.net sql-server-2000
如果您指的是Data Transformation Services,它是 sql server 2000 的一部分(在以后的版本中不可用,因为它已被集成服务取代),那么有几种方法。
如果您的应用位于服务器上,则可以使用 process.start 从 DTSRun 运行它
process.start("dtsrun /S ""server name"" /U sa /N ""d:\task.dts""")
如果它不在服务器上,您仍然可以使用DTSRun,但在您使用 master.dbo.xp_cmdshell 调用的存储过程中,然后在您的代码中调用 SP。 (虽然如果你使用xp_cmdshell你必须意识到打开的安全风险)。
或者,您可以查看这篇文章,它解释了如何从 vb 脚本执行此操作,但代码可以轻松转换。:
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5164094.html
【讨论】:
这是一组相当粗糙的类,如果您想对来自 VB.Net 的 DTS 包进行编程控制,它们应该可以满足您的需求。我不保证它的正确性或可靠性,但它应该为您提供足够的入门指导。
只需将 DTSPackage 对象 (COM) 库的引用添加到您的 Visual Studio 项目中
Option Explicit On
选项严格开启
导入 DTS 导入 System.Runtime.InteropServices
命名空间测试 公共类 DTSRunner 私有 cpPoint 作为 ComTypes.IConnectionPoint 私有 cpContainer 作为 ComTypes.IConnectionPointContainer 私有 intCookie 作为整数 私有 PES 作为 PackageEventsSink
Public Sub RunPackage(ByVal packageName As String)
Dim pkg As New DTS.PackageClass
pkg.LoadFromSQLServer("MySQLServer", String.Empty, String.Empty, DTS.DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection, String.Empty, String.Empty, String.Empty, PackageName, System.Reflection.Missing.Value)
cpContainer = CType(pkg, ComTypes.IConnectionPointContainer)
cpContainer.FindConnectionPoint(New Guid("10020605-EB1C-11CF-AE6E-00AA004A34D5"), cpPoint)
PES = New PackageEventsSink
cpPoint.Advise(PES, intCookie)
AddHandler PES.OnPackageOnError, AddressOf PackageErroredHandler
AddHandler PES.OnPackageOnQueryCancel, AddressOf PackageQueryCancelHandler
pkg.Execute()
If cpPoint IsNot Nothing Then
cpPoint.Unadvise(intCookie)
End If
If Not pkg Is Nothing Then
pkg.UnInitialize()
End If
If PES IsNot Nothing Then
RemoveHandler PES.OnPackageOnError, AddressOf PackageErroredHandler
RemoveHandler PES.OnPackageOnQueryCancel, AddressOf PackageQueryCancelHandler
End If
PES = Nothing
cpContainer = Nothing
cpPoint = Nothing
pkg = Nothing
End Sub
Private Sub PackageErroredHandler(ByVal sender As Object, ByVal e As DTSEventArgs)
If Not packageErrored Then
TraceEvent(TraceEventType.Error, -1, _
"Error In DTS Package : {1} - {2} - {3} - {4}", _
.EventSource, e.ErrorCode, e.Source, e.Description)
packageErrored = True
End If
e.Cancel = False
End Sub
Private Sub PackageQueryCancelHandler(ByVal sender As Object, ByVal e As DTSEventArgs)
e.Cancel = False
End Sub
Private Class DTSEventArgs
Inherits EventArgs
Public EventSource As String
Public ErrorCode As Integer
Public Source As String
Public Description As String
Public Cancel As Boolean
Public PercentComplete As Integer = 0
Public Sub New(ByVal EventSource As String, ByVal Source As String, ByVal Description As String, ByVal ErrorCode As Integer, ByVal Cancel As Boolean)
Me.EventSource = EventSource
Me.Source = Source
Me.Description = Description
Me.ErrorCode = ErrorCode
Me.Cancel = Cancel
End Sub
End Class
Private Delegate Sub PackageOnErrorEventHandler(ByVal sender As Object, ByVal e As DTSEventArgs)
Private Delegate Sub PackageOnFinishEventHandler(ByVal sender As Object, ByVal e As DTSEventArgs)
Private Delegate Sub PackageOnStartEventHandler(ByVal sender As Object, ByVal e As DTSEventArgs)
Private Delegate Sub PackageOnProgressEventHandler(ByVal sender As Object, ByVal e As DTSEventArgs)
Private Delegate Sub PackageOnQueryCancelEventHandler(ByVal sender As Object, ByVal e As DTSEventArgs)
Private Class PackageEventsSink
Implements DTS.PackageEvents
Public Event OnPackageOnError As PackageOnErrorEventHandler
Public Event OnPackageOnFinish As PackageOnFinishEventHandler
Public Event OnPackageOnStart As PackageOnStartEventHandler
Public Event OnPackageOnProgress As PackageOnProgressEventHandler
Public Event OnPackageOnQueryCancel As PackageOnQueryCancelEventHandler
Overridable Overloads Sub OnError(ByVal EventSource As String, _
ByVal ErrorCode As Integer, ByVal Source As String, _
ByVal Description As String, ByVal HelpFile As String, _
ByVal HelpContext As Integer, ByVal IDofInterfaceWithError As String, _
ByRef pbCancel As Boolean) Implements DTS.PackageEvents.OnError
Dim e As New DTSEventArgs(EventSource, Source, Description, ErrorCode, pbCancel)
TraceEvent(TraceEventType.Verbose, 0, String.Format(" OnError in {0}; ErrorCode = {1}, Source = {2}, Description = {3}, HelpFile = {4}, HelpContext = {5}, IDofInterfaceWithError = {6}", EventSource, ErrorCode, Source, Description, HelpFile, HelpContext, IDofInterfaceWithError))
RaiseEvent OnPackageOnError(Me, e)
pbCancel = e.Cancel
End Sub
Overridable Overloads Sub OnFinish(ByVal EventSource As String) Implements DTS.PackageEvents.OnFinish
Dim e As New DTSEventArgs(EventSource, String.Empty, "Execution Finished", 0, False)
TraceEvent(TraceEventType.Verbose, 0, String.Format(" OnFinish in {0}", EventSource))
RaiseEvent OnPackageOnFinish(Me, e)
End Sub
Overridable Overloads Sub OnProgress(ByVal EventSource As String, _
ByVal ProgressDescription As String, ByVal PercentComplete As Integer, _
ByVal ProgressCountLow As Integer, ByVal ProgressCountHigh As Integer) _
Implements DTS.PackageEvents.OnProgress
Dim e As New DTSEventArgs(EventSource, String.Empty, ProgressDescription, 0, False)
e.PercentComplete = PercentComplete
TraceEvent(TraceEventType.Verbose, 0, String.Format(" OnProgress in {0}; ProgressDescription = {1}, PercentComplete = {2}, ProgressCountLow = {3}, ProgressCountHigh = {4}", EventSource, ProgressDescription, PercentComplete, ProgressCountLow, ProgressCountHigh))
RaiseEvent OnPackageOnProgress(Me, e)
End Sub
Overridable Overloads Sub OnQueryCancel(ByVal EventSource As String, ByRef pbCancel As Boolean) Implements DTS.PackageEvents.OnQueryCancel
Dim e As New DTSEventArgs(EventSource, String.Empty, String.Empty, 0, pbCancel)
TraceEvent(TraceEventType.Verbose, 0, String.Format(" OnQueryCancel in {0}; pbCancel = {1}", EventSource, pbCancel))
RaiseEvent OnPackageOnQueryCancel(Me, e)
pbCancel = e.Cancel
End Sub
Overridable Overloads Sub OnStart(ByVal EventSource As String) Implements DTS.PackageEvents.OnStart
Dim e As New DTSEventArgs(EventSource, String.Empty, "Execution Started", 0, False)
TraceEvent(TraceEventType.Verbose, 0, String.Format(" OnStart in {0}", EventSource))
RaiseEvent OnPackageOnStart(Me, e)
End Sub
End Class
#End Region
End Class
End Namespace
【讨论】: