Daj Się Poznać 2016 – podsumowanie

Skoro po dłuższej nieobecności na blogu zaczęło się trochę więcej dziać dzięki konkursowi Daj Się Poznać, a dziś – 31 maja – jest ostatni dzień konkursu i wysyp postów podsumowujących to czemu nie napisać kilku słów od siebie? Co się udało, czego się nie udało zrobić i dlaczego. Wpis kompletnie nietechniczny. Trochę po to, żeby było ich więcej niż trzynaście. Zbieżność z liczbą dla niektórych przesądną powiedzmy że przypadkowa. Czytaj dalej

Własna kontrolka SSIS – część 10 – DBCommand i parametry

Jedną z zalet używania mało wykorzystywanych rozwiązań jest fakt, że nie wszystko co można zrobić dalej da się znaleźć w Google. Albo da się znaleźć, ale proponowane rozwiązanie nie działa (albo dotyczy wywołania procedury zamiast polecenia SQL). Czyli wracamy do starej dobrej metody prób i błędów. Ot – takie DBCommand użyte jako warstwa abstrakcji ponieważ użyłem OLE DB jako jednego z managerów połączeń może skutkować kilkoma godzinami siedzenia nad jednym krótkim kawałkiem kodu.

Problem jaki się pojawił w przypadku kontrolki to zapis informacji o pobranych plikach w bazie. Samo wywołanie komendy to nic trudnego. Dla uproszczenia przyjmijmy zwykłe polecenie INSERT:

DbCommand cmd = this.connection.CreateCommand();
cmd.CommandText = @"
    INSERT INTO dbo.DownloadedFiles (RemoteFilePath, RemoteDirectoryName, LocalFileName, AuditKey, FileStatusId)
    VALUES ('A', 'B', 'C', 1, 1)
";

cmd.ExecuteNonQuery();

I wszystko gra. Ale jeśli chcemy użyć parametrów, to już jest nieco trudniej. Czytaj dalej

Własna kontrolka SSIS – część 9 – metadane pobierania plików

Pobieranie plików z serwera SFTP za pomocą biblioteki WinSCPNet to nic nadzwyczaj trudnego. Jest dobrze opisujący to przykład wykorzystujący funkcję GetFiles() – nic tylko kopiować i używać. W naszym przypadku będzie z tym nieco więcej roboty bo najpierw musimy określić, które pliki nas interesują, a dopiero potem je pobrać. Żeby określić, które nas interesują musimy najpierw mieć informację o plikach już pobranych – żeby nie pobierać tych zbędnych. Żeby mieć informację o plikach już pobranych musimy najpierw ją gdzieś zapisać. Żeby ją zapisać musimy mieć do tego jakieś struktury. Żeby mieć struktury – po prostu je zbudujmy.
Czytaj dalej

Własna kontrolka SSIS, część 8 – po co mi było to OLEDB?

Od samego początku było jasne: pobieramy dane z serwera SFTP/FTPS/FTP i zapisujemy wszystkie metadane w bazie SQL Server (a potem może pomyślimy czy umożliwimy to też w innej). Do obsługi komunikacji z bazą SQL Server wybrałem arbitralnie OLEDB Connection Manager. Bo w pracy zawodowej używam najczęściej i mam opanowaną pracę z nim.

Tyle, że nie.

Znaczy się – wiem jak go używać i w ogóle. I używam. Z powodzeniem. Ale dotąd jakoś niespecjalnie używałem z poziomu programowania. Bo gdybym używał, to prawdopodobnie bym się nie zdecydował. Z dokumentacji wiedziałbym, że:

Many connection managers return unmanaged COM objects (System.__ComObject) and these objects cannot easily be used from managed code. The list of these connection managers includes the frequently used OLE DB connection manager.

Po prostu bajka. To co, zmieniamy typ managera połączeń np. na ADO.NET i korzystamy z przestrzeni nazw System.Data.SqlClient.SqlConnection, czy kombinujemy jak koń pod górę wiedząc, że jesteśmy być może skazani z góry na niepowodzenie?

No jasne, ja też wybieram to drugie.
Czytaj dalej

Jak debugować kod kontrolki SSIS?

Skoro na razie nie mamy testów jednostkowych, to trzeba wykombinować jak sprawdzać o co chodzi z błędami, które się pojawiają przy tworzeniu kontrolki. Dobrze jednak by było wiedzieć coś więcej niż enigmatyczne komunikaty „nieprawidłowe coś tam w czymś”. Kiedy ustawimy jednak punkt przerwania (breakpoint) i uruchomimy projekt wyskakuje okienko, że dla biblioteki to nie da się ot tak kliknąć i już.

DebugTypeLibraryError

Jak w takim razie sprawdzać co się dzieje bez konieczności ustawiania zbędnych fragmentów kodu, które np. wypiszą nam coś na konsoli (albo – o zgrozo – zastosują MsgBox)? Fajne są te narzędzia w Visual Studio i chcemy z nich korzystać! I kropka.

No to skorzystajmy. I przeżyjmy krótką przygodę z elementami pytań i zdziwień. Czytaj dalej

Własna kontrolka SSIS, część 7 – komunikacja z serwerem SFTP

Jeśli chcesz przez ponad godzinę szukać błędu w kodzie, który po wprowadzeniu ostatnich kosmetycznych zmian niemal się nie różni od poprzedniej wersji, to chyba nie ma nic lepszego od podmiany biblioteki używanej w referencjach. Dzień wcześniej. I zapomnienia o tym.

Przez to poprawnie działający pakiet SSIS nagle krzyczy błędami, a wycofanie zmian nic nie daje. Dopiero olśnienie po odejściu od komputera – skoro ustawiam referencję do nowej biblioteki, to pewnie rejestrowałem ją w GAC! I rzeczywiście – usunięcie poprzedniej wersji oraz dodanie nowej pomogło. Dzięki temu straciłem tylko niewielką część zmian, kiedy robiłem kolejne „Undo” z poziomu gita w poszukiwaniu „tej jednej przeoczonej zmiany”.

Kontrolka WinSCP może już się podłączać do serwera SFTP, to pora żeby zaczęła robić coś więcej. W obecnym rozwiązaniu korzystam z kawałka kodu odczytującego rekurencyjnie pliki w katalogach. Ale przy oglądaniu nowości w dokumentacji WinSCP okazało się, że będzie można użyć do tego tylko jednej instrukcji – Session.EnumerateRemoteFiles – w takim razie wykorzystamy ją do pobrania listy plików.

Klasy pomocnicze

Klasa WinSCPTask będzie zawierać tylko metody wymagane przez silnik SSIS. Pozostałe polecenia będą obsługiwane przez inne klasy z tego samego projektu. I już na początku mam zagwozdkę – jak nazwać klasę, która będzie odpowiadać za komunikację między SSIS a serwerem SFTP.

W ramach tej klasy powstaną metody, które z pomocą przesłanych parametrów (m.in. connection manager, transaction object) nawiążą komunikację z serwerem, po czym odpytają go odpowiednio a na koniec pracy grzecznie się rozłączą. Wszystko polega na wywołaniu metod biblioteki WinSCP, a pojęcia które mi przychodzą w związku z tym na myśl to proxywrapper. Nazwy mogą niechcący sugerować związek z wzorcami projektowymi, ale używałem ich dotąd tak mało i na tyle na czuja, że niekoniecznie musi to być to. W każdym razie na początek przyjmuję nazwę WinSCPWrapper dla klasy wywołującej metody WinSCP.

API – przynajmniej na początku – nie będzie przesadnie rozbudowane:

  • Połącz się z serwerem – wywołanie AcquireConnection z naszego managera połączenia do serwera SFTP
  • Pobierz listę plików – wywołanie metody EnumerateRemoteFiles biblioteki WinSCPNet
  • Pobierz pliki – wywołanie metody GetFiles biblioteki WinSCPNet
  • Odłącz się od serwera – wywołanie metody ReleaseConnection z naszego managera połączenia do serwera SFTP

Prawdopodobnie odrębne wywołanie ReleaseConnection będzie nadmiarowe, ale to wyjdzie przy testowaniu i debugowaniu.

Przy omawianiu pobierania listy plików zapisałem, żeby spróbować pominąć rekurencję przy szukaniu plików – czyli żeby nie sprawdzać podkatalogów. Super sprawa, że da się to zrobić przez ustawianie opcji EnumerationOptions metody EnumerateRemoteFiles – jeśli chcemy rekurencję ustawiamy wartość EnumerationOptions.AllDirectories, a jeśli nie, to EnumerationOptions.None. Szybkie i proste. Ustawiane to będzie przez kolejną opcję kontrolki.

Na razie więcej tu szkicu rozwiązania niż samego mięsa. Trochę specjalnie – przy budowaniu komunikacji z serwerem SFTP będzie trzeba sprawdzić, czy to działa dobrze. Na razie obserwując na żywo logi serwera widać, że łączy się i rozłącza prawidłowo, ale to nie do końca to. Do tej pory nie znalazłem jak podejść do tematu testów jednostkowych dla kontrolki SSIS, ale może pojawi się światełko w tunelu – w następnym odcinku sprawdzimy jak wykorzystać debugger, żeby sprawdzać poprawność kodu biblioteki.

Własna kontrolka SSIS, część 6 – podłączamy się do serwera SFTP

Mamy szkielet kontrolki. Umiemy napisać coś, co się poprawnie kompiluje i nawet pojawia się w przyborniku SSIS (SSIS Toolbox). Sukces! To teraz pora sprawić, żeby kontrolka mogła się połączyć z serwerami SFTP i SQL. Do roboty.

Na pierwszy ogień połączymy się z SFTP (dla FTPS będzie podobnie). Jeśli nie mamy jakiegoś serwera pod ręką proponuję ściągnąć darmowy Rebel Tiny SFTP Server, który bardzo dobrze się sprawdza do testowania własnego kodu. Po uruchomieniu automatycznie generują się potrzebne klucze i serwer jest gotowy do działania.
Czytaj dalej