Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Data Flow и ReinitalizeMetadata()  [new]
Mgvlad
Member

Откуда: Минск
Сообщений: 97
Здравствуйте. Подскажите новичку...

Задачка:
Есть несколько баз MSSQL2005. Все на одном сервере. В каждой по 50-80 таблиц с азной структурой, которые надо выгружать в файлы каждый день на клиентские серверы. Хочу сделать этот процесс при помощи Data Flow, в виде универсального паккаджа, которому через пользовательские переменные передаётся ConnectionString, имя таблицы или вьюшки, путь к директории где должен лежать файлик. При помощи выражений формирую запрос для OLEDB Source, полный путь для Flat File Source. Всё замечательно работает. на первом запуске :). На втором запуске (когда пытаемся грузить табличку с другой структурой) по старой доброй традиции Data Flow сваливается на ошибку - VS_NEEDSNEWMETADATA - не совпадает структура метадаты.
Почитал литературу (отдельное спасибо Alexes за ссылку тут.
Благодаря той ссылке, потихоньку я нашёл описание проблемы и способ решения её

Но как применять этот метод я так и не разобрался (опыта кот наплакал). Надеюсь All мне поможет
Я так полагаю мне в Control Flow необходимо перед Data Flow добавить Script Task и там уже упражнятся с обновлением метадаты. Может кто-нибудь поможет хотя бы примерный код этого таска набросать. В MSDN пример по использованию этой функции есть, но непонятно как заставить её обновлять метадату именно того Data Flow который нужно.
Вопрос может наивный, но простите уж меня ))))))))
Пример использования ReinitializeMetaData():

Private areInputColumnsValid As Boolean = True 

Public  Overrides Function Validate() As DTSValidationStatus 
 Dim input As IDTSInput100 = ComponentMetaData.InputCollection(0) 
 Dim vInput As IDTSVirtualInput100 = input.GetVirtualInput 
 Dim Cancel As Boolean = False 
 For Each column As IDTSInputColumn100 In input.InputColumnCollection 
   Try 
     Dim vColumn As IDTSVirtualInputColumn100 = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID) 
   Catch 
     ComponentMetaData.FireError(0, ComponentMetaData.Name, "The input column " + column.IdentificationString + " does not match a column in the upstream component.", "", 0, Cancel) 
     areInputColumnsValid = False 
     Return DTSValidationStatus.VS_NEEDSNEWMETADATA 
   End Try 
 Next 
 Return DTSValidationStatus.VS_ISVALID 
End Function 

Public  Overrides Sub ReinitializeMetaData() 
 If Not areInputColumnsValid Then 
   Dim input As IDTSInput100 = ComponentMetaData.InputCollection(0) 
   Dim vInput As IDTSVirtualInput100 = input.GetVirtualInput 
   For Each column As IDTSInputColumn100 In input.InputColumnCollection 
     Dim vColumn As IDTSVirtualInputColumn100 = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID) 
     If vColumn Is Nothing Then 
       input.InputColumnCollection.RemoveObjectByID(column.ID) 
     End If 
   Next 
   areInputColumnsValid = True 
 End If 
End Sub
1 дек 09, 12:45    [8001663]     Ответить | Цитировать Сообщить модератору
 Re: Data Flow и ReinitalizeMetadata()  [new]
Mgvlad
Member

Откуда: Минск
Сообщений: 97
Сорри, совсем забыл указать версии:
Microsoft SQL Server 2005 - 9.00.3042.00 (X64) Feb 10 2007 00:59:02 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)

MS Windows Server 2003 R2 Standart x64 Edition SP2
2 дек 09, 14:47    [8008597]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить