2015-02-09 3 views
0

Я новичок в этом форуме, и это моя первая тема, поэтому я надеюсь опубликовать ее в нужном месте.Преобразование DTS ActiveX в задачу скрипта в SSIS

Я не знаю ни одного C#, но я знаю некоторые VB, я перенес свой пакет DTS в SSIS, но я не могу заставить скрипт ActiveX работать и решил перезаписать его в задаче скрипта. У меня есть 4 глобальные переменные, и все они имеют значения, уже установленные в меню глобальных переменных. ссылка на картинку: Link. Код ActiveX существует, поэтому пользователь может просто изменить 2 vars при переключении сервера/базы данных, и он все равно будет делать то же самое на таблицах (все таблицы имеют одинаковое имя на всех серверах и базах данных, так что не нужно настраиваться), и он автоматически запускается ежедневно. Это оригинальный ActiveX код:

Function Main() 

Dim sEnvironm  
Dim sServer    
Dim sSourceFile  
Dim sSourcePath  
Dim sBackupPath 
Dim sErrorPath  
Dim sFileName   
Dim sUDLPath  

'********************************************************* 
' Set vars 
' 
' First 2 are depending on the server and db 
' FILL IN THE RIGHT VALUES 
' 
'********************************************************* 
sEnvironm = "MON_Datamart" 
sServer = "W0254" 



' --- DO NOT CHANGE ANYTHING BELOW THIS LINE --- 
' --- 
sSourceFile = "\\" & sServer & "\Data_sql\" & sEnvironm & "\DTS\SourceFiles\tbl_L47T1.txt" 
sSourcePath = "\\" & sServer & "\Data_sql\" & sEnvironm & "\DTS\SourceFiles\" 
sBackupPath = "\\" & sServer & "\Data_sql\" & sEnvironm & "\DTS\BackupFiles\" 
sErrorPath = "\\" & sServer & "\Data_sql\" & sEnvironm & "\DTS\ErrorFiles\" 
sFileName = "tbl_L47T1.txt" 
sUDLPath = "\\" & sServer & "\Data_sql\" & sEnvironm & "\UDL\" & sEnvironm & ".udl" 


FoundError = False 

Set oPackage = DTSGlobalVariables.Parent 

Set oConnection = oPackage.Connections("tbl_L47T1.txt") 
oConnection.DataSource = sSourceFile 

Set oConnection = oPackage.Connections("Datamart") 
oConnection.UDLPath = sUDLPath 

Set oConnection = oPackage.Connections("Truncate") 
oConnection.UDLPath = sUDLPath 

Set oTask = oPackage.Tasks("DTSTask_DTSDataPumpTask_1").CustomTask 
oTask.SourceObjectName = sSourceFile 
oTask.DestinationObjectName = sEnvironm & ".dbo.stg_tbl_L47T1" 

DTSGlobalVariables("SourcePath").Value = sSourceFile 
DTSGlobalVariables("BackupPath").Value = sBackupPath 
DTSGlobalVariables("ErrorPath").Value = sErrorPath 
DTSGlobalVariables("FileName").Value = sFileName 

Set oTask = Nothing 
Set oConnection = Nothing 
Set oPackage = Nothing 

Main = DTSTaskExecResult_Success 

End Function 

И это то, что я до сих пор:

Public Sub Main() 

     Dim sEnvironm As String 
     Dim sServer As String 
     Dim sSourceFile As String 
     Dim sSourcePath As String 
     Dim sBackupPath As String 
     Dim sErrorPath As String 
     Dim sFileName As String 
     Dim sUDLPath As String 
     Dim FoundError As Boolean 
     Dim oPackage As Object 
     Dim oConnection As Object 
     Dim oTask As Object 
     Dim DTSGlobalVariables As Object 



     '********************************************************* 
     ' Set vars 
     ' 
     ' First 2 are depending on the server and db 
     ' FILL IN THE RIGHT VALUES 
     ' 
     '********************************************************* 
     sEnvironm = "MON_Datamart" 
sServer = "W0254" 



' --- DO NOT CHANGE ANYTHING BELOW THIS LINE --- 
' --- 
sSourceFile = "\\" & sServer & "\Data_sql\" & sEnvironm & "\DTS\SourceFiles\tbl_L47T1.txt" 
sSourcePath = "\\" & sServer & "\Data_sql\" & sEnvironm & "\DTS\SourceFiles\" 
sBackupPath = "\\" & sServer & "\Data_sql\" & sEnvironm & "\DTS\BackupFiles\" 
sErrorPath = "\\" & sServer & "\Data_sql\" & sEnvironm & "\DTS\ErrorFiles\" 
sFileName = "tbl_L47T1.txt" 
sUDLPath = "\\" & sServer & "\Data_sql\" & sEnvironm & "\UDL\" & sEnvironm & ".udl" 

FoundError = False 

oPackage = Dts.Variables("User::VariableName").Value 

oConnection = oPackage.Connections("tbl_L47T1.txt") 
oConnection.DataSource = sSourceFile 

oConnection = oPackage.Connections("Datamart") 
oConnection.UDLPath = sUDLPath 

oConnection = oPackage.Connections("Truncate") 
oConnection.UDLPath = sUDLPath 

oTask = oPackage.Tasks("DTSTask_DTSDataPumpTask_1").CustomTask 
oTask.SourceObjectName = sSourceFile 
oTask.DestinationObjectName = sEnvironm & ".dbo.stg_tbl_L47T1" 

DTSGlobalVariables("SourcePath").Value = sSourceFile 
DTSGlobalVariables("BackupPath").Value = sBackupPath 
DTSGlobalVariables("ErrorPath").Value = sErrorPath 
DTSGlobalVariables("FileName").Value = sFileName 

oTask = Nothing 
oConnection = Nothing 
oPackage = Nothing 

Main = DTSTaskExecResult_Success 
    End Sub 

Если я отладки это я получаю много ошибок, и я понятия не имею, о том, как их исправить ...

ошибка:

Error: System.Reflection.TargetInvocationException: Het doel van een aanroep heeft een uitzondering veroorzaakt. ---> Microsoft.SqlServer.Dts.Runtime.DtsRuntimeException: The element cannot be found in a collection. This error happens when you try to retrieve an element from a collection on a container during execution of the package and the element is not there. 
---> System.Runtime.InteropServices.COMException (0xC0010009): The element cannot be found in a collection. This error happens when you try to retrieve an element from a collection on a container during execution of the package and the element is not there. 

    bij Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSVariables100.get_Item(Object Index) 
    bij Microsoft.SqlServer.Dts.Runtime.Variables.get_Item(Object index) 
    --- Einde van intern uitzonderingsstackpad --- 
    bij Microsoft.SqlServer.Dts.Runtime.Variables.get_Item(Object index) 
    bij ST_f32fc12b60f34bebbbdfc0c5e5b40a96.vbproj.ScriptMain.Main() 
    --- Einde van intern uitzonderingsstackpad --- 
    bij System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
    bij System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
    bij System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    bij System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    bij System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) 
    bij System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, CultureInfo culture) 
    bij Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 

Может кто-то пожалуйста, помогите мне преобразовать это в дальнейшем? Я застрял и не знаю, как исправить мои ошибки ...

Заранее спасибо!

  • Майкл
+1

Я предлагаю вам полностью избавиться от своего сценария и вместо этого использовать _package configurations_ для установки исходного сервера. Затем вы просто редактируете XML-файл, а не фактический пакет. –

+0

Привет, Ник и спасибо, что комментировали мою проблему! С конфигурациями пакетов вы имеете в виду соединение, которое я должен был сделать в БД в пакете, или что вы подразумеваете под этим? Кроме того, я даже не слышал о XML-файле, как я могу сделать эту функцию так, чтобы ее можно было использовать как скрипт для ежедневного запуска пакета? – Michael843

+0

В какой версии SQL Server работают ваши пакеты? 2012 или более ранней версии? пожалуйста, пометьте его. Если вы проведете некоторое исследование конфигураций пакетов SSIS _file_, все будет объяснено. Почему вы не читаете здесь, первое, что появилось в поиске: https://msdn.microsoft.com/en-us/library/cc895212.aspx, затем задайте некоторые конкретные вопросы. –

ответ

0

Я предлагаю вам избавиться от вашего сценария вообще и вместо того, чтобы использовать конфигурации пакетов для установки исходного сервера. Затем вы просто редактируете XML-файл, а не фактический пакет.

Вот хороший гид: https://www.simple-talk.com/sql/ssis/xml-configuration-files-in-sql-server-integration-services/

Просто что-то помните: не изменить логическое имя менеджера соединений, вместо того, чтобы изменить строку подключения внутри него.

Я предлагаю вам переименовать своих менеджеров соединений в соответствие с тем, что они на самом деле (то есть «клиентская система» при извлечении клиентов из системы клиентов), а не на том, на каком сервере они указывают (MySQLServerHost \ SQLExpress.DBName), поскольку фактическая информация о подключении будет изменяться из ваших конфигураций.