Преобразование DTS ActiveX в задачу сценария в службах SSIS

Я новичок на этом форуме, и это моя первая тема, поэтому я надеюсь, что размещаю ее в правильном месте.

Я не знаю никакого С#, но я немного знаю VB, я перенес свой пакет DTS в SSIS, но я не могу заставить работать сценарий ActiveX и решил переписать его в задаче сценария. У меня есть 4 глобальные переменные, и все они имеют значения, уже установленные в меню глобальных переменных. ссылка на картинку: Ссылка. Там есть код 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()

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

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

  • Майкл

person Michael843    schedule 09.02.2015    source источник
comment
Я предлагаю вам полностью избавиться от вашего скрипта и вместо этого использовать конфигурации пакетов для установки исходного сервера. Затем вы просто редактируете файл XML, а не сам пакет.   -  person Nick.McDermaid    schedule 09.02.2015
comment
Привет, Ник, и спасибо, что прокомментировал мою проблему! Что касается конфигураций пакетов, вы имеете в виду подключение, которое я должен был установить к БД в пакете, или что вы подразумеваете под этим? Кроме того, я никогда даже не слышал о файле XML, как я могу сделать эту функцию, чтобы ее можно было использовать как скрипт для ежедневного автоматического запуска пакета?   -  person Michael843    schedule 09.02.2015
comment
На какой версии SQL Server работают ваши пакеты? 2012 или более ранняя версия? Пожалуйста, отметьте это. Если вы проведете некоторое исследование конфигураций пакета SSIS file, все будет объяснено. Почему бы вам не почитать отсюда, первое, что попалось в поиске: msdn.microsoft.com/en-us/library/cc895212.aspx, а затем задайте несколько конкретных вопросов.   -  person Nick.McDermaid    schedule 10.02.2015
comment
Я добавил тег для версии, которую использую (предприятие 2008 г.). Я свяжусь с вами, как только у меня возникнут более конкретные вопросы, но только для уточнения; можно ли использовать файл XML для автоматического ежедневного запуска пакета, а также сделать так, чтобы при изменении источника данных он менял все пути во всех пакетах? Все таблицы, используемые пакетами, имеют одно и то же имя на всех серверах и базах данных, поэтому, если сервер и/или БД будут изменены, все они должны работать одинаково, но на другом сервере без каких-либо изменений, что возможно с XML. ? Спасибо.   -  person Michael843    schedule 10.02.2015
comment
Да, это возможно с конфигурациями XML. Автоматическая ежедневная часть обычно выполняется с помощью задания агента SQL.   -  person Nick.McDermaid    schedule 10.02.2015
comment
Я понял, как изменить переменные с помощью XML, чтобы мне не нужно было каждый раз делать это внутри BIDS, очень полезно! Как сделать то же самое с подключением к серверу и базе данных в источнике данных?   -  person Michael843    schedule 10.02.2015
comment
Я думаю, это объясняет это довольно хорошо. simple-talk.com /sql/ssis/   -  person Nick.McDermaid    schedule 10.02.2015
comment
Я буду создавать отдельный XML-файл для каждой таблицы, которую необходимо обновить из моего .txt-файла (это я уже настроил с помощью потока управления). Это потому, что каждый txt и связанная с ним таблица в БД имеют разные имена, поэтому я просто создайте XML для каждого пакета, чтобы изменить переменные. Когда это будет сделано, я просто скопирую ВСЕ пакеты и XML-файлы, и все, что мне нужно сделать, это изменить соединение с сервером и базой данных в КАЖДОМ XML-файле, но мне просто нужно знать, КАК я могу сделать свой XML-файл способным изменить соединение для пакет, с которым он связан. Мне просто нужен кусок кода, чтобы изменить соединение с XML.   -  person Michael843    schedule 11.02.2015
comment
Я нашел этот веб-сайт: vyaskn.tripod.com/ кажется, они объясняют, что я ищу но (может быть, это только я) я не могу понять, о чем, черт возьми, он говорит, и со всеми различными примерами кода, которые он предоставляет, я понятия не имею, какой из них я должен использовать и что в нем я должен изменить...   -  person Michael843    schedule 11.02.2015
comment
Забудьте о написании кода. Кода нет. Перейдите по этой ссылке simple -talk.com/sql/ssis/ и следуйте инструкциям из раздела Настройка файла конфигурации XML. В разделе «Выберите свойства для экспорта» просмотрите и выберите все элементы, которые вы хотите изменить, т. е. все диспетчеры соединений с базой данных и с файлами. Когда вы нажмете FINISH в мастере, он создаст для вас файл XML. Доберитесь до этого места и отправьте ответ.   -  person Nick.McDermaid    schedule 11.02.2015
comment
Как только вы это сделаете, каждый раз, когда вы запускаете пакет, он просматривает файл XML (по указанному вами пути) и применяет то, что находит там. Таким образом, в этом мастере, если вы сохранили там свойство «путь к файлу», и вам нужно изменить этот путь, вы изменяете файл XML, и он будет применяться к пакету. Обычно у вас есть точно такой же путь, настроенный на разных серверах с разные значения, поэтому в зависимости от сервера, на котором он работает, значения меняются. Вы также можете использовать эти значения непосредственно из задания агента SQL, если это поможет.   -  person Nick.McDermaid    schedule 11.02.2015
comment
Как я уже сказал, я уже прочитал это и сделал это. Я могу изменить все переменные, но мне нужно изменить соединение. эта ссылка говорит о добавлении имени сервера в XML. Мне это 0 пользы. Я посмотрел дальше в Интернете и обнаружил, что мне нужно выбрать свойство ConnectionString. Я сделал это, но когда я изменяю строку подключения в XML и запускаю пакет SSIS, я получаю сообщение об ошибке. Я думаю, вы меня неправильно понимаете. В диспетчере соединений я хочу добавить НОВОЕ соединение из XML-файла, которого не было внутри диспетчера, прежде чем я выполню пакет. ошибка:   -  person Michael843    schedule 11.02.2015
comment
НАЗВАНИЕ: Ошибка проверки пакета --------------------------------------------- Ошибка проверки пакета ------------ ------------------ ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Ошибка в Package1: соединение BRECHTPROESMANS\SQL2008R2.MON_Datamart не найдено. Эта ошибка выдается коллекцией Connections, когда определенный элемент соединения не найден. (Microsoft.DataTransformationServices.VsIntegration) ------------------------------ КНОПКИ: OK ---------- --------------------   -  person Michael843    schedule 11.02.2015
comment
Это ошибка, которую я получаю, если пытаюсь изменить сервер, который в данный момент использует пакет. Итак вкратце: ConnectionString беру с сервера BRECHTPROESMANS и базы данных MON_Datamart. Это соединение уже находится внутри диспетчера соединений, и пакет работает на 100% на этом сервере и БД, НО Если я изменю строку соединения на сервер BRECHTPROESMANS\SQL2008R2 и базу данных MON_Datamart, тогда я получу вышеуказанную ошибку. Он не должен найти соединение, он должен СОЗДАТЬ соединение с этим новым сервером и базой данных и запустить там пакет.   -  person Michael843    schedule 11.02.2015
comment
Однако, если я вручную добавлю соединение OLE DB в диспетчере соединений, пакет будет работать нормально, как и должно быть на новом сервере и БД. Мне просто нужен файл XML, чтобы добавить новое соединение OLE DB.   -  person Michael843    schedule 11.02.2015
comment
Ваш существующий сценарий DTS ActiveX изменяет существующие соединения. Ваши существующие потоки данных SSIS используют существующие соединения. Я не понимаю, почему вам нужно создать новое соединение. Вы должны изменить свойства существующего соединения (точно так же, как это делает ваш скрипт ActiveX), которое использует ваш существующий поток данных. Имя диспетчера соединений (которое вы видите внизу) является логическим именем и не отражает того, чем на самом деле является соединение. На самом деле вы должны сразу же переименовать их в логическое имя «системы», а не в имя сервера.   -  person Nick.McDermaid    schedule 11.02.2015
comment
Конфиг «находит» существующий диспетчер соединений и изменяет в нем строку подключения (или сервер, или базу данных, или путь к файлу) на основе того, что находится в файле конфигурации. Затем существующие потоки данных используют тот же диспетчер соединений и подключаются на основе строки соединения, которая могла быть ранее изменена конфигурацией (или переключателем командной строки или заданием агента SQL).   -  person Nick.McDermaid    schedule 11.02.2015
comment
Соединение BRECHTPROESMANS\SQL2008R2.MON_Datamart не найдено означает, что что-то (возможно, конфигурация) попыталось сослаться на диспетчер соединений с логическим именем BRECHTPROESMANS\SQL2008R2.MON_Datamart, но не смогло его найти. Это плохое имя для диспетчера соединений. Вы должны переименовать его в то, что представляет собой эта система, а не в информацию о соединении.   -  person Nick.McDermaid    schedule 11.02.2015
comment
Omg, я глупый... Я редактировал имя объекта ТАКЖЕ как имя сервера и БД, поэтому мой объект не существовал.... Я думал, что имя диспетчера соединений представляет фактическое соединение, которое он сделал. Теперь это работает! Большое вам спасибо за вашу помощь! ‹3   -  person Michael843    schedule 11.02.2015
comment
Не могли бы вы ввести свой комментарий в качестве ответа, чтобы я мог пометить это как решенное, чтобы это могло помочь и другим людям.   -  person Michael843    schedule 11.02.2015
comment
совсем не глупый.... просто поднимаюсь по кривой обучения!! удачи во всем. Эти имена менеджеров соединений вводят в заблуждение.   -  person Nick.McDermaid    schedule 12.02.2015


Ответы (1)


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

Вот хорошее руководство: https://www.simple-talk.com/sql/ssis/xml-configuration-files-in-sql-server-integration-services/

Просто помните: не редактируйте логическое имя диспетчера соединений, вместо этого редактируйте строку соединения внутри него.

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

person Nick.McDermaid    schedule 11.02.2015