Visual Studio + SQL


(Latos 89) #1

Witam,

korzystam z VS C++ i SQL Express oraz Postgres.

Muszę wygenerować dane za pomocą select z bazy Postgres i dodać te wpisy do Express.

Moje pytanie, czy istnieje możliwość pobrania w prosty i wygodny sposób zrobienia DataSet inserta do drugiej bazy, jeśli nie to jaki mogę przemieszczać szybko dane między dwoma serwerami?

Oraz jaki proponujecie sposób by porównać dwa zapytania z różnych serwerów.


(Tomek Matz) #2

Może zainteresuje Cię rozwiązanie, które nie wymaga pisania aplikacji. Zamieszczam link, który może być dobrym punktem startowym http://stackoverflow.com/questions/711303/setting-up-a-linked-server-from-sql-server-2005-to-postgresql


(Latos 89) #3

Dzięki matzu:D

Mam aby problem bo chcę w zapytaniu użyć znaku specjalnego apostrofa ' , jak mogę pozbyć się tego problemu? (w zapytaniu z Postges)

a takie pytanie, a wiesz jak mogę połączyć się na odwrót (gdyby zaszła potrzeba zrobienia inserta w postgres)?

P.S.

Nadal czekam jak można to zrobić w vc# lub vc++


(Tomek Matz) #4

Na temat połączenia MS SQL Server -> PostgreSQL znalazłem jeszcze trzy linki. Możesz je sobie przejrzeć:

http://www.postgresonline.com/journal/a ... 4-bit.html

http://www.postgresonline.com/journal/a ... -Data.html

http://www.postgresonline.com/journal/a ... -woes.html

W tych linkach korzystali ze sterowników ODBC z tej strony http://www.postgresql.org/ftp/odbc/versions/msi/.

Teraz odnośnie Twoich pytań ...

Ja na PostgreSQL się nie znam. Udzieliłem Ci wcześniej odpowiedzi, bo początkowo chciałeś przesyłać dane z PostgreSQL do MS SQL Server, a to da się prosto rozwiązać właśnie dzięki użyciu tzw. linked servers (nie wiem jak to się tłumaczy na polski - serwery połączone?). No ale poszperałem trochę w sieci i generalnie PostgreSQL nie pozwala na wykonywanie zapytań na innych serwerach niż lokalny. Choć da się to obejść, dzięki DbLink http://www.postgresonline.com/journal/a ... rvers.html. Sęk w tym, że z tego linku wynika, że to działa tylko jeśli zdalny serwer to PostgreSQL (choć mogłem czegoś nie doczytać). W tym temacie http://stackoverflow.com/questions/4632 ... h-postgres ktoś sugerował, że jest możliwe wykonywanie zapytań na MS SQL Server przy użyciu jakiegoś osobnego sterownika ODBC. Możesz sobie ten link też przejrzeć.

W każdym bądź razie ... jeśli masz już ustanowione połączenie MS SQL Server -> PostgreSQL to przecież insert-y, update-y, delete-y w PostgreSQL możesz wykonywać przy użyciu tego połączenia. Możliwe, że napotkasz jakieś problemy, ale generalnie ja bym zaczął od tego rozwiązania.

http://www.postgresql.org/docs/8.3/inte ... AX-STRINGS

Jeśli miałoby to być na DataSet-ach to będziesz musiał wygenerować jeden DataSet dla bazy danych MS SQL Server, a drugi dla PostgreSQL. Następnie mógłbyś spróbować skorzystać z metody Merge http://msdn.microsoft.com/en-us/library/system.data.dataset.merge.aspx. Choć ja nigdy nie używałem jej do łączenia danych z tabel pochodzących z różnych baz danych, więc nie wiem jakie z tego mogą wyniknąć problemy (problemy mogą wynikać z tego, że schemat tych tabel nie będzie identyczny). Będziesz musiał zagłębić się w dokumentację.

Jeśli metoda Merge się nie sprawdzi, to wówczas lepiej będzie wykorzystać w tej aplikacji jakiegoś ORM-a (ADO .NET Entity Framework, NHibernate). Który z nich lepiej wybrać to już musisz zapytać kogoś kto miał okazję pracować z PostgreSQL. Ja raz miałem okazję pisać aplikację, w której przesyłałem dane z jednej bazy danych do drugiej i wtedy właśnie pracowałem na obiektach będących odwzorowaniem wybranych tabel (choć w sumie ta aplikacja była pisana przy użyciu innego języka programowania, a obydwie bazy danych to był Oracle ). Jeśli okaże się, że żaden ORM nie oferuje dostatecznego wsparcia dla PostgreSQL, to możesz napisać własną uproszczoną wersję takiego ORM-a. Wszelkie instrukcje SQL wykonywałbyś wtedy przy użyciu zwykłego ADO .NET (http://npgsql.projects.postgresql.org/ - .Net Data Provider for Postgresql), a rezultaty instrukcji SQL wrzucałbyś do swoich klas odwzorowujących wybrane tabele.

Rozwiązanie z użyciem linked servers jest o tyle dobre, że np. możesz sobie przygotować zapytanie, które ściągnie dane z danej tabeli z bazy danych PostgreSQL i porówna te dane (w oparciu o np. ID) z danymi z danej tabeli z bazy danych MS SQL Server, a następnie wstawi tam gdzie będzie trzeba tylko te brakujące. Oczywiście to tylko przykład, bo tak na prawdę nie wiem co będziesz przesyłał pomiędzy tymi bazami danych.


(Latos 89) #5

Wielkie dzięki za wszelką pomoc :slight_smile:

Z początku źle trochę napisałem posta, bo połączenie do obu baz miałem (Npgsql i SqlClient) tylko nie wiedziałem jak pobrać dane z DataSet.

Pogooglowałem i znalazłem jak pobrać dane z DataSet (ds2->Tables[0]->Rows[0][0]), sam próbowałem odwołać się Rows[0]->Columns[0] ale na takie coś jest nie dopuszczalne.

Puki co pobieram dane i podaje je jako parametry do insert'a. 1400 insert'ów = około 8s.

Mam do Ciebie pytanie, co jest bardziej efektywne w wysyłaniu danych do serwera (z własnego doświadczenia):

  • robienie tego za pomocą Adaptera

  • robienie przy pomocy Transaction

W PgAdmin problemu nie mam z zapytaniem, tylko jak włożyłem do zapytania w MSSM, np.

SELECT * FROM OpenQuery(POSTGRESQLX,'select * from xxx where yyy between '00' and '99'')

Problem w tym, że chcę by apostrof przed i za 00 zabrało mi jako tekst a nie znak specjalny.

Sposoby do połączenia z Postgres do SQL Express sprawdzę jak skończę zaczęty projekt. Zawsze może się przydać takie połączenie do zapytania.

Jeszcze raz dzięki :smiley:


(Tomek Matz) #6

OK, czyli jeśli dobrze rozumiem to na razie nie chcesz używać tych linked servers, a chcesz robić wszystko w aplikacji. Niech będzie ... Powiem Ci tylko jeszcze kiedy pisanie takiej aplikacji ma sens, a mianowicie w sytuacji, gdy dane, które pobierasz z jednej bazy danych musisz porozrzucać po różnych tabelach w drugiej bazie danych, bo struktury baz danych na tych dwóch serwerach nie są identyczne (są wręcz diametralnie różne). W każdym innym przypadku aplikacja jest niepotrzebna (no chyba, że miałaby tylko służyć do wywoływania procedur składowanych co jakiś określony czas).

Rozumiem, ale to w takim bądź razie powiedz mi do czego są Ci tutaj potrzebne DataSet-y? Przecież tak na prawdę nie używasz żadnych udogodnień, które one oferują, a piszesz wszystko z palca, tj. iterujesz po rekordach wybranej tabeli. Nie lepiej w takim bądź razie zrobić wszystko przy użyciu "czystego" (ja to tak nazywam) ADO .NET (tzn. wyniki zapytań odczytywać przy użyciu NpgsqlDataReader, itp.) połączonego z użyciem procedur składowanych (jeśli nie chcesz spróbować użyć żadnego ORM-a)? Poza tym lepiej by było jeśli byś pobierał dane partiami (np. co 200 rekordów), a nie od razu całą tabelę.

To pytanie jest trochę chybione, bo jeśli już używasz (a raczej używałbyś) metody Update danego adaptera, to i tak musisz zapewnić, żeby każda instrukcja SQL (tj. delete, insert, update), która będzie wykonywana przez tą metodę, była wykonywana w jednej transakcji (domyślnie każda instrukcja SQL traktowana jest jako niezależna od pozostałych). Czyli reasumując musisz powiązać dany adapter z jakąś transakcją.

Jeśli chcesz, żeby w tekście znalazł się ' to musisz go zapisać jako ''. Możesz też zainteresować się tym poleceniem http://msdn.microsoft.com/en-us/library/ms174393.aspx, które daje możliwość używania podwójnego jak i pojedynczego cudzysłowu.

I jeszcze jedno, używanie * w Select to zły pomysł. Lepiej jest jawnie określić jakie kolumny potrzebujesz. Co jeśli dodasz jakąś kolumnę w tabeli? Może to doprowadzić do tego, że część kodu przestanie działać lub co gorsza zacznie działać niewłaściwie.


(Latos 89) #7

Program ma wywoływać się automatycznie raz dziennie więc, linked servers odpada ale na 100% przyda się do zapytań innych które zapewne z czasem przyjdą.

Ja ogółem jestem laikiem więc dlatego to pytanie z adapterem, na jednym portalu był przykład Delete, Insert, Update i Select (każde osobno) za pomocą adaptera.Więc zwątpiłem bo ja korzystam połączenia adaptera i transakcji, ale wszystko w prosty i szybki sposób mi wszystko wyjaśniłeś :smiley:

Z gwiazdą w selekcie nie pomyślałem, ale użyłem jej tylko w przykładzie. W moim programie wyciągam aby część kolumn więc i tak musiałem z łapy podać jakie.

Chętnie bym zrobił wszystko za pomocą "czystego", ale nie wiem do końca używać ADO.NET itp:/

Posiadasz może jakiś kurs lub polecasz książkę do nauki?

Nie chcę Cię tutaj zamęczać pytaniami, a widzę że znasz się dobrze na tym.

Interesowało by mnie jak korzystać z SDK itp, wydajność (buffor, wątki i ilość zużywanych zasobów), eksport i import do różnych plików i jak stworzyć porządnie wydruk oraz co nie co o komunikacji z portem RS.

Z szkoły nie wyniosłem niestety nic, bo sam wiedziałem więcej od wykładowcy.


(Tomek Matz) #8

Pisałem o tym wyżej ... Mógłbyś sobie przygotować procedurę składowaną (wykorzystującą linked servers), a następnie wywoływałbyś ją w samej aplikacji. Ta aplikacja to mogłaby być usługa Windows, w której miałbyś ustawiony Timer lub mogłaby to być zwykła aplikacja konsolowa, którą skonfigurowałbyś sobie w harmonogramie zadań Windows.

Co do tej książki/kursu to nie będę się tutaj powtarzał i dam link do tematu, gdzie już na ten temat pisałem:

http://forum.dobreprogramy.pl/ktora-ksiazke-2010-wybrac-wasze-opinie-t450366.html#p2852271

Dodam tutaj tylko strony, na których można znaleźć bardzo dobre artykuły:

http://www.codeproject.com/

http://www.codeguru.pl/

Poza tym google/bing jest Twoim dobrym przyjacielem :slight_smile: No i oczywiście skarbnica wiedzy na temat wszystkich produktów Microsoft jaką jest dokumentacja MSDN http://msdn.microsoft.com/pl-pl/default. Na stronach MSDN oprócz typowej dokumentacji technicznej znajdziesz też np. video-tutoriale.

Większość tematów, które Cię interesują jest poruszane w tej książce, o której wspomniałem wyżej. Nie przypominam sobie tylko, żeby była tam mowa o komunikacji z portem szeregowym. Od tego jest klasa SerialPort http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx. Raczej nie ma też mowy o drukowaniu. Od tego jest przede wszystkim klasa PrintDocument http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.aspx. Jakbyś chciał się bardziej zagłębić w proces drukowania to hasła kluczowe to raporty RDLC oraz RDL (i związana z tym kontrolka ReportViewer).


(Latos 89) #9

Z tych trzech stron co podałeś zaglądałem nie raz, ale nie wszystko jest w CLR i nie raz są problemy z małymi szczegółami by przełożyć na ten język:/

Wolę trochę łopatologii, a później korzystanie z kodów (by wiedzieć co z czym się je i gryzie).

W książkę zaopatrzę się w najbliższym czasie. Teraz tylko jakiś szalony pomysł na skomplikowaną aplikację by mieć jakiś cel :smiley:

Dzięki za wszystko :smiley:

Pozdrawiam,

Buckie


(somekind) #10

To zwykłym Jobem w SQL Server Agent nie można?


(Tomek Matz) #11

Myślałem nad tym, ale nie wiem jak uruchomić SQL Server Agent w wersji Express SQL Server-a.