Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc

C# Projects

Malá řešení pro velké projekty.
SSIS OLE DB Destination versus AS400 DB2

Při svém bádání nad možným i nemožným propojování světů a galaxií jsem narazil na problém, který myslím stojí za to uveřejnit a podělit se s vámi. Již (dovolím si říci) spolehlivě fungující technologie OLE DB přináší občas mnohá překvapení v podobě chybových hlášení, jejichž popis nenajdete nikde na internetu a to ani na stránkách výrobců a vývojářů propojovaných technologií. Můj případ byl naštěstí vyjímkou a řešení svého problému jsem našel (sice až úplně dole v pomyslné hromadě informací) na internetu v nějakém velmi zastrčeném vlákně jakési diskuzní skupiny.

A teď již k samotnému problému. Jedná se o použítí Data Flow Component, konkrétně OLE DB Destination adaptéru v SLQ Server Integration Services (SSIS). Tak jako užívám OLE DB Source komponentu pro pumpování dat z tabulek IBM AS400 DB2 stroje, chtěl jsem použít pro zpáteční cestu logicky OLE DB Destination adaptér. Vytvořil jsem tedy nové Native OLE DB připojení a jako poskytovatele jsem použil 'IBM DB2 UDB for iSeries IBMDA400 OLE DB Provider'. Je to ten samý provider kterého používám tahání dat z AS400 do SQL Serveru 2005. Bohužel, po té co jsem nakonfiguroval připojení, ověřil, že test spojení proběhl, komponenta při své validaci nahlásí chybu:

TITLE: Microsoft Visual Studio
------------------------------
Error at Export Product Monitoring to AS400 [OLE DB Destination [526]]: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code: 0x80004005. An OLE DB record is available.  Source: "IBMDA400 File Rowset"  Hresult: 0x80004005  Description: "CPF4328: Member ROI13P not journaled to journal *N.".
Error at Export Product Monitoring to AS400 [OLE DB Destination [526]]: Opening a rowset for "A73ROE.ROI16P" failed. Check that the object exists in the database.
------------------------------
ADDITIONAL INFORMATION: Exception from HRESULT: 0xC02020E8 (Microsoft.SqlServer.DTSPipelineWrap)
------------------------------

Zlí jazykové tvrdí, že jediná možnost jak toto vyřešit je ta, že zapnete 'journaling' tabulky ke které přistupujete na AS400. Komponenta totiž požaduje transakční zpracování a to bez zapnutého 'journalingu' na straně AS400 nelze. Alespoň takové vysvětlení jsem dostal. Navíc administrátoři těchto systémů k přistupují k zapínání 'journalingu' velmi neradi, už proto, že tzv. 'journaling' je neskutečný požírač prostoru a i když nastavíte velikosti souborů kam se se změny ukládají, musíte nějakým způsobem zajistit postupné odmazávání starších verzí těchto odkládacích ('journalovacích') souborů, protože systém po dosažení velikosti souboru tento ponechá a vytvoří nový. Nedochází tedy k přepisu starého souboru.

Řešení které zde popisuji nevyžaduje vůbec žádný 'journaling' ani jinou podobnou úchylárnu na straně 'Velké Modré'. Stačí jen, když místo zmiňovaného a na OLE DB Source komponentách úspěšně používaného poskytovatele s názvem 'IBM DB2 UDB for iSeries IBMDA400 OLE DB Provider' použijete jiného, který se též nachází pod skupinou Native OLE DB\SQL Native Client a jmenuje se (pozor!!" skoro stejně) 'IBM DB2 UDB for iSeries IBMDASQL OLE DB Provider'. V tuto chvíli vám již OLE DB Destination komponenta zafunguje bez zmiňované chyby.

 P.S: Není to buhví jaké řešení, ale je to řešení. Pokud by někdo z vás měl  zkušennosti s psaním vlastních SSIS komponent (já jsem již nějaké napsal, ale občas by se mi šikla nejaká ta konzultace) budu rád když se ozvete.

Tak se zatím mějte krásně.

 Mirek

Posted: 28. května 2007 13:42 by MirekE

Komentář

Žádné komentáře

Neregistrovaní uživatele nemužou přidávat komentáře.
Vyvojar.cz na prodej!