'Dts' 未声明 - VB 2010 连接字符串作为 DB2 SSIS 包的变量
'Dts' is not declared - VB 2010 Connection string as variable to DB2 SSIS package
坦白说,我现在的处境是必须即时学习 VB 脚本。这是问题所在:
在 VB 2010 脚本任务中,我不得不在我的 SSIS 包中的多个脚本任务中对 DB2 连接字符串进行硬编码。在 VB 2005 中,连接字符串被设置为一个变量,我在 VB 2010 中已经这样做了。我在脚本任务中将变量声明为 read/write。我的其他变量有效,但我的 DB2 和 MS SQL 连接字符串都需要硬编码才能工作。我看到的错误是“'Dts' 未声明。”我确信它被声明为代码的其他部分使用正常工作的 dts 变量。我已经搜索了一个解决方案,但还没有找到任何有效的方法。感谢您提供的任何见解。下面的代码已擦除敏感信息并用星号替换:
' Microsoft SQL Server Integration Services Script Task
' Write scripts using Microsoft Visual Basic
' The ScriptMain class is the entry point of the Script Task.
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Data.OleDb
Imports System.Data.SqlClient
<Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute> _
<System.CLSCompliantAttribute(False)> _
Partial Public Class ScriptMain
Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
Enum ScriptResults
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
End Enum
' The execution engine calls this method when the task executes.
' To access the object model, use the Dts object. Connections, variables, events,
' and logging features are available as static members of the Dts class.
' Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
'
' To open Code and Text Editor Help, press F1.
' To open Object Browser, press Ctrl+Alt+J.
Dim db2Con As OleDbConnection = Nothing
Dim strError As String = Nothing
Dim db2Cmd As OleDbCommand = Nothing
Dim db2Rdr As OleDbDataReader = Nothing
Dim EODC_Audit_DataTable As New DataTable
Public Sub Main()
'
' Add your code here
'
Dts.Variables("Audit_Row_Ct").Value = CheckForEODC()
Dts.TaskResult = ScriptResults.Success
End Sub
Public Function CheckForEODC() As Integer
CheckForEODC = 0
Try
If Not DB2RS.SetDBCon(db2Con, strError) Then Throw New Exception(strError)
If Not DB2RS.SetDBCmd(db2Con, db2Cmd, "SELECT * FROM " + Dts.Variables("Region").Value.ToString + ".****", strError) Then Throw New Exception(strError)
db2Rdr = db2Cmd.ExecuteReader
EODC_Audit_DataTable.Load(db2Rdr)
Catch ex As Exception
Dts.VariableDispenser.LockForWrite("stdError")
Dts.Variables("strError").Value = "Load Error: " & ex.Message & "<br /> "
Dts.Variables.Unlock()
Finally
DB2RS.DisposeOfObjects(db2Con, db2Cmd, db2Rdr)
End Try
If (**** < 1) Then
CheckForEODC = 0
Else
CheckForEODC = ****
End If
End Function
End Class
Public Class DB2RS
Public Shared Function SetDBCon( _
ByRef dbCon As OleDbConnection, _
ByRef strError As String _
) As Boolean
Try
dbCon = New OleDbConnection(Dts.Variables("DB2ConnectionString").Value.ToString)
dbCon.Open()
SetDBCon = True
Catch ex As Exception
strError = ex.Message
SetDBCon = False
End Try
End Function
Public Shared Function SetDBCmd( _
ByRef dbCon As OleDbConnection, _
ByRef dbCmd As OleDbCommand, _
ByVal strCmd As String, _
ByRef strError As String _
) As Boolean
Try
dbCmd = New OleDbCommand(strCmd, dbCon)
dbCmd.CommandType = Data.CommandType.Text
SetDBCmd = True
Catch ex As Exception
strError = ex.Message
SetDBCmd = False
End Try
End Function
Public Shared Sub DisposeOfObjects( _
Optional ByRef dbCon As OleDbConnection = Nothing, _
Optional ByRef dbCmd As OleDbCommand = Nothing, _
Optional ByRef dbRdr As OleDbDataReader = Nothing, _
Optional ByRef dbAda As OleDbDataAdapter = Nothing, _
Optional ByRef dbDSet As DataSet = Nothing, _
Optional ByRef dTable As DataTable = Nothing, _
Optional ByRef dView As DataView = Nothing _
)
Try
If Not IsNothing(dbDSet) Then
dbDSet.Dispose()
dbDSet = Nothing
End If
Catch ex As Exception
dbDSet = Nothing
End Try
Try
If Not IsNothing(dbAda) Then
dbAda.Dispose()
dbAda = Nothing
End If
Catch ex As Exception
dbAda = Nothing
End Try
Try
If Not IsNothing(dbRdr) Then
If Not dbRdr.IsClosed Then dbRdr.Close()
dbRdr = Nothing
End If
Catch ex As Exception
dbRdr = Nothing
End Try
Try
If Not IsNothing(dbCmd) Then
dbCmd.Dispose()
End If
Catch ex As Exception
dbCmd = Nothing
End Try
Try
If Not IsNothing(dbCon) Then
If dbCon.State = ConnectionState.Open Then
dbCon.Close()
End If
dbCon.Dispose()
End If
Catch ex As Exception
dbCon = Nothing
End Try
Try
If Not IsNothing(dTable) Then
dTable.Dispose()
dTable = Nothing
End If
Catch ex As Exception
dTable = Nothing
End Try
Try
If Not IsNothing(dView) Then
dView.Dispose()
dView = Nothing
End If
Catch ex As Exception
dView = Nothing
End Try
End Sub
Public Shared Function Null2Space( _
ByVal strValue As Object, _
Optional ByVal blnDash As Boolean = False _
) As String
Try
If IsNothing(strValue) Then
If blnDash Then
Null2Space = " - "
Else
Null2Space = " "
End If
ElseIf strValue Is System.DBNull.Value Then
If blnDash Then
Null2Space = " - "
Else
Null2Space = " "
End If
ElseIf strValue.ToString.Trim.Length() < 1 Then
If blnDash Then
Null2Space = " - "
Else
Null2Space = " "
End If
Else
Null2Space = strValue.ToString.Trim()
End If
Catch ex As Exception
Null2Space = strValue.ToString
End Try
End Function
End Class
Public Class DBSQLRS
Public Shared Function SetDBCon( _
ByRef dbCon As SqlConnection, _
ByRef strError As String, _
Optional ByVal dbName As String = "*****", _
Optional ByVal dbUser As String = "*****" _
) As Boolean
Try
If dbUser = "ELI_Web" Then
dbCon = New SqlConnection("*****")
ElseIf dbUser = "ELI_URP" Then
dbCon = New SqlConnection("*****")
End If
dbCon.Open()
SetDBCon = True
Catch ex As Exception
strError = ex.Message
SetDBCon = False
End Try
End Function
Public Shared Function SetDBCmd( _
ByRef dbCon As SqlConnection, _
ByRef dbCmd As SqlCommand, _
ByVal strCmd As String, _
ByRef strError As String _
) As Boolean
Try
dbCmd = New SqlCommand(strCmd, dbCon)
dbCmd.CommandType = Data.CommandType.StoredProcedure
SetDBCmd = True
Catch ex As Exception
strError = ex.Message
SetDBCmd = False
End Try
End Function
Public Shared Function SetDBPar( _
ByRef dbCmd As SqlCommand, _
ByRef dbPar As SqlParameter, _
ByVal strParName As String, _
ByVal objParValue As Object, _
ByVal dbType As Data.SqlDbType, _
ByRef strError As String _
) As Boolean
Try
dbPar = New SqlParameter(strParName, dbType)
dbPar.IsNullable = True
dbPar.Value = objParValue
dbCmd.Parameters.Add(dbPar)
SetDBPar = True
Catch ex As Exception
strError = ex.Message
SetDBPar = False
End Try
End Function
Public Shared Sub DisposeOfObjects( _
Optional ByRef dbCon As SqlConnection = Nothing, _
Optional ByRef dbCmd As SqlCommand = Nothing, _
Optional ByRef dbPar As SqlParameter = Nothing, _
Optional ByRef dbRdr As SqlDataReader = Nothing, _
Optional ByRef dbAda As SqlDataAdapter = Nothing, _
Optional ByRef dbDSet As DataSet = Nothing, _
Optional ByRef dTable As DataTable = Nothing, _
Optional ByRef dView As DataView = Nothing _
)
Try
If Not IsNothing(dbDSet) Then
dbDSet.Dispose()
dbDSet = Nothing
End If
Catch ex As Exception
dbDSet = Nothing
End Try
Try
If Not IsNothing(dbAda) Then
dbAda.Dispose()
dbAda = Nothing
End If
Catch ex As Exception
dbAda = Nothing
End Try
Try
If Not IsNothing(dbRdr) Then
If Not dbRdr.IsClosed Then dbRdr.Close()
dbRdr = Nothing
End If
Catch ex As Exception
dbRdr = Nothing
End Try
Try
If Not IsNothing(dbPar) Then
dbPar = Nothing
End If
Catch ex As Exception
dbPar = Nothing
End Try
Try
If Not IsNothing(dbCmd) Then
dbCmd.Dispose()
End If
Catch ex As Exception
dbCmd = Nothing
End Try
Try
If Not IsNothing(dbCon) Then
If dbCon.State = ConnectionState.Open Then
dbCon.Close()
End If
dbCon.Dispose()
End If
Catch ex As Exception
dbCon = Nothing
End Try
Try
If Not IsNothing(dTable) Then
dTable.Dispose()
dTable = Nothing
End If
Catch ex As Exception
dTable = Nothing
End Try
Try
If Not IsNothing(dView) Then
dView.Dispose()
dView = Nothing
End If
Catch ex As Exception
dView = Nothing
End Try
End Sub
Public Shared Function Null2Space( _
ByVal strValue As Object, _
Optional ByVal blnDash As Boolean = False _
) As String
Try
If IsNothing(strValue) Then
If blnDash Then
Null2Space = " - "
Else
Null2Space = " "
End If
ElseIf strValue Is System.DBNull.Value Then
If blnDash Then
Null2Space = " - "
Else
Null2Space = " "
End If
ElseIf strValue.ToString.Trim.Length() < 1 Then
If blnDash Then
Null2Space = " - "
Else
Null2Space = " "
End If
Else
Null2Space = strValue.ToString.Trim()
End If
Catch ex As Exception
Null2Space = strValue.ToString
End Try
End Function
End Class
看起来 Dts
是您 ScriptMain
class 中的一个实例 属性(继承自 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
)。
但是,您的 OleDbConnection()
调用在另一个名为 DB2RS
的 class 中,它无法访问 ScriptMain
class如Dts
。
如果您不明白这一点,您应该退后一步,学习 Visual Basic 编程初学者 class,因为即使下一个解决方案对您有帮助,您也不会走得更远。这里有一些资源
- 在线课程:Microsoft Visual Basic Fundamentals for Absolute Beginners
- 图书:Beginning Visual Basic 2015
- 图书:Visual Basic .NET Database Programming For Dummies
解决眼前问题的一种方法是将 Dts
作为参数传递给 DB2RS.SetDBCon()
调用。更改此行:
If Not DB2RS.SetDBCon(db2Con, strError) Then Throw New Exception(strError)
至:
If Not DB2RS.SetDBCon(db2Con, Dts, strError) Then Throw New Exception(strError)
然后你需要添加Dts
作为SetDBCon()
函数的参数。我相信 Dts
的类型是 Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel
,因此我将其包含在下面。如果那是错误的,你需要调整那个类型..
Public Class DB2RS
Public Shared Function SetDBCon( _
ByRef dbCon As OleDbConnection, _
ByRef Dts As Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel, _
ByRef strError As String _
) As Boolean
坦白说,我现在的处境是必须即时学习 VB 脚本。这是问题所在: 在 VB 2010 脚本任务中,我不得不在我的 SSIS 包中的多个脚本任务中对 DB2 连接字符串进行硬编码。在 VB 2005 中,连接字符串被设置为一个变量,我在 VB 2010 中已经这样做了。我在脚本任务中将变量声明为 read/write。我的其他变量有效,但我的 DB2 和 MS SQL 连接字符串都需要硬编码才能工作。我看到的错误是“'Dts' 未声明。”我确信它被声明为代码的其他部分使用正常工作的 dts 变量。我已经搜索了一个解决方案,但还没有找到任何有效的方法。感谢您提供的任何见解。下面的代码已擦除敏感信息并用星号替换:
' Microsoft SQL Server Integration Services Script Task
' Write scripts using Microsoft Visual Basic
' The ScriptMain class is the entry point of the Script Task.
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Data.OleDb
Imports System.Data.SqlClient
<Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute> _
<System.CLSCompliantAttribute(False)> _
Partial Public Class ScriptMain
Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
Enum ScriptResults
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
End Enum
' The execution engine calls this method when the task executes.
' To access the object model, use the Dts object. Connections, variables, events,
' and logging features are available as static members of the Dts class.
' Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
'
' To open Code and Text Editor Help, press F1.
' To open Object Browser, press Ctrl+Alt+J.
Dim db2Con As OleDbConnection = Nothing
Dim strError As String = Nothing
Dim db2Cmd As OleDbCommand = Nothing
Dim db2Rdr As OleDbDataReader = Nothing
Dim EODC_Audit_DataTable As New DataTable
Public Sub Main()
'
' Add your code here
'
Dts.Variables("Audit_Row_Ct").Value = CheckForEODC()
Dts.TaskResult = ScriptResults.Success
End Sub
Public Function CheckForEODC() As Integer
CheckForEODC = 0
Try
If Not DB2RS.SetDBCon(db2Con, strError) Then Throw New Exception(strError)
If Not DB2RS.SetDBCmd(db2Con, db2Cmd, "SELECT * FROM " + Dts.Variables("Region").Value.ToString + ".****", strError) Then Throw New Exception(strError)
db2Rdr = db2Cmd.ExecuteReader
EODC_Audit_DataTable.Load(db2Rdr)
Catch ex As Exception
Dts.VariableDispenser.LockForWrite("stdError")
Dts.Variables("strError").Value = "Load Error: " & ex.Message & "<br /> "
Dts.Variables.Unlock()
Finally
DB2RS.DisposeOfObjects(db2Con, db2Cmd, db2Rdr)
End Try
If (**** < 1) Then
CheckForEODC = 0
Else
CheckForEODC = ****
End If
End Function
End Class
Public Class DB2RS
Public Shared Function SetDBCon( _
ByRef dbCon As OleDbConnection, _
ByRef strError As String _
) As Boolean
Try
dbCon = New OleDbConnection(Dts.Variables("DB2ConnectionString").Value.ToString)
dbCon.Open()
SetDBCon = True
Catch ex As Exception
strError = ex.Message
SetDBCon = False
End Try
End Function
Public Shared Function SetDBCmd( _
ByRef dbCon As OleDbConnection, _
ByRef dbCmd As OleDbCommand, _
ByVal strCmd As String, _
ByRef strError As String _
) As Boolean
Try
dbCmd = New OleDbCommand(strCmd, dbCon)
dbCmd.CommandType = Data.CommandType.Text
SetDBCmd = True
Catch ex As Exception
strError = ex.Message
SetDBCmd = False
End Try
End Function
Public Shared Sub DisposeOfObjects( _
Optional ByRef dbCon As OleDbConnection = Nothing, _
Optional ByRef dbCmd As OleDbCommand = Nothing, _
Optional ByRef dbRdr As OleDbDataReader = Nothing, _
Optional ByRef dbAda As OleDbDataAdapter = Nothing, _
Optional ByRef dbDSet As DataSet = Nothing, _
Optional ByRef dTable As DataTable = Nothing, _
Optional ByRef dView As DataView = Nothing _
)
Try
If Not IsNothing(dbDSet) Then
dbDSet.Dispose()
dbDSet = Nothing
End If
Catch ex As Exception
dbDSet = Nothing
End Try
Try
If Not IsNothing(dbAda) Then
dbAda.Dispose()
dbAda = Nothing
End If
Catch ex As Exception
dbAda = Nothing
End Try
Try
If Not IsNothing(dbRdr) Then
If Not dbRdr.IsClosed Then dbRdr.Close()
dbRdr = Nothing
End If
Catch ex As Exception
dbRdr = Nothing
End Try
Try
If Not IsNothing(dbCmd) Then
dbCmd.Dispose()
End If
Catch ex As Exception
dbCmd = Nothing
End Try
Try
If Not IsNothing(dbCon) Then
If dbCon.State = ConnectionState.Open Then
dbCon.Close()
End If
dbCon.Dispose()
End If
Catch ex As Exception
dbCon = Nothing
End Try
Try
If Not IsNothing(dTable) Then
dTable.Dispose()
dTable = Nothing
End If
Catch ex As Exception
dTable = Nothing
End Try
Try
If Not IsNothing(dView) Then
dView.Dispose()
dView = Nothing
End If
Catch ex As Exception
dView = Nothing
End Try
End Sub
Public Shared Function Null2Space( _
ByVal strValue As Object, _
Optional ByVal blnDash As Boolean = False _
) As String
Try
If IsNothing(strValue) Then
If blnDash Then
Null2Space = " - "
Else
Null2Space = " "
End If
ElseIf strValue Is System.DBNull.Value Then
If blnDash Then
Null2Space = " - "
Else
Null2Space = " "
End If
ElseIf strValue.ToString.Trim.Length() < 1 Then
If blnDash Then
Null2Space = " - "
Else
Null2Space = " "
End If
Else
Null2Space = strValue.ToString.Trim()
End If
Catch ex As Exception
Null2Space = strValue.ToString
End Try
End Function
End Class
Public Class DBSQLRS
Public Shared Function SetDBCon( _
ByRef dbCon As SqlConnection, _
ByRef strError As String, _
Optional ByVal dbName As String = "*****", _
Optional ByVal dbUser As String = "*****" _
) As Boolean
Try
If dbUser = "ELI_Web" Then
dbCon = New SqlConnection("*****")
ElseIf dbUser = "ELI_URP" Then
dbCon = New SqlConnection("*****")
End If
dbCon.Open()
SetDBCon = True
Catch ex As Exception
strError = ex.Message
SetDBCon = False
End Try
End Function
Public Shared Function SetDBCmd( _
ByRef dbCon As SqlConnection, _
ByRef dbCmd As SqlCommand, _
ByVal strCmd As String, _
ByRef strError As String _
) As Boolean
Try
dbCmd = New SqlCommand(strCmd, dbCon)
dbCmd.CommandType = Data.CommandType.StoredProcedure
SetDBCmd = True
Catch ex As Exception
strError = ex.Message
SetDBCmd = False
End Try
End Function
Public Shared Function SetDBPar( _
ByRef dbCmd As SqlCommand, _
ByRef dbPar As SqlParameter, _
ByVal strParName As String, _
ByVal objParValue As Object, _
ByVal dbType As Data.SqlDbType, _
ByRef strError As String _
) As Boolean
Try
dbPar = New SqlParameter(strParName, dbType)
dbPar.IsNullable = True
dbPar.Value = objParValue
dbCmd.Parameters.Add(dbPar)
SetDBPar = True
Catch ex As Exception
strError = ex.Message
SetDBPar = False
End Try
End Function
Public Shared Sub DisposeOfObjects( _
Optional ByRef dbCon As SqlConnection = Nothing, _
Optional ByRef dbCmd As SqlCommand = Nothing, _
Optional ByRef dbPar As SqlParameter = Nothing, _
Optional ByRef dbRdr As SqlDataReader = Nothing, _
Optional ByRef dbAda As SqlDataAdapter = Nothing, _
Optional ByRef dbDSet As DataSet = Nothing, _
Optional ByRef dTable As DataTable = Nothing, _
Optional ByRef dView As DataView = Nothing _
)
Try
If Not IsNothing(dbDSet) Then
dbDSet.Dispose()
dbDSet = Nothing
End If
Catch ex As Exception
dbDSet = Nothing
End Try
Try
If Not IsNothing(dbAda) Then
dbAda.Dispose()
dbAda = Nothing
End If
Catch ex As Exception
dbAda = Nothing
End Try
Try
If Not IsNothing(dbRdr) Then
If Not dbRdr.IsClosed Then dbRdr.Close()
dbRdr = Nothing
End If
Catch ex As Exception
dbRdr = Nothing
End Try
Try
If Not IsNothing(dbPar) Then
dbPar = Nothing
End If
Catch ex As Exception
dbPar = Nothing
End Try
Try
If Not IsNothing(dbCmd) Then
dbCmd.Dispose()
End If
Catch ex As Exception
dbCmd = Nothing
End Try
Try
If Not IsNothing(dbCon) Then
If dbCon.State = ConnectionState.Open Then
dbCon.Close()
End If
dbCon.Dispose()
End If
Catch ex As Exception
dbCon = Nothing
End Try
Try
If Not IsNothing(dTable) Then
dTable.Dispose()
dTable = Nothing
End If
Catch ex As Exception
dTable = Nothing
End Try
Try
If Not IsNothing(dView) Then
dView.Dispose()
dView = Nothing
End If
Catch ex As Exception
dView = Nothing
End Try
End Sub
Public Shared Function Null2Space( _
ByVal strValue As Object, _
Optional ByVal blnDash As Boolean = False _
) As String
Try
If IsNothing(strValue) Then
If blnDash Then
Null2Space = " - "
Else
Null2Space = " "
End If
ElseIf strValue Is System.DBNull.Value Then
If blnDash Then
Null2Space = " - "
Else
Null2Space = " "
End If
ElseIf strValue.ToString.Trim.Length() < 1 Then
If blnDash Then
Null2Space = " - "
Else
Null2Space = " "
End If
Else
Null2Space = strValue.ToString.Trim()
End If
Catch ex As Exception
Null2Space = strValue.ToString
End Try
End Function
End Class
看起来 Dts
是您 ScriptMain
class 中的一个实例 属性(继承自 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
)。
但是,您的 OleDbConnection()
调用在另一个名为 DB2RS
的 class 中,它无法访问 ScriptMain
class如Dts
。
如果您不明白这一点,您应该退后一步,学习 Visual Basic 编程初学者 class,因为即使下一个解决方案对您有帮助,您也不会走得更远。这里有一些资源
- 在线课程:Microsoft Visual Basic Fundamentals for Absolute Beginners
- 图书:Beginning Visual Basic 2015
- 图书:Visual Basic .NET Database Programming For Dummies
解决眼前问题的一种方法是将 Dts
作为参数传递给 DB2RS.SetDBCon()
调用。更改此行:
If Not DB2RS.SetDBCon(db2Con, strError) Then Throw New Exception(strError)
至:
If Not DB2RS.SetDBCon(db2Con, Dts, strError) Then Throw New Exception(strError)
然后你需要添加Dts
作为SetDBCon()
函数的参数。我相信 Dts
的类型是 Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel
,因此我将其包含在下面。如果那是错误的,你需要调整那个类型..
Public Class DB2RS
Public Shared Function SetDBCon( _
ByRef dbCon As OleDbConnection, _
ByRef Dts As Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel, _
ByRef strError As String _
) As Boolean