Visual Studio + SQL

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.

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

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++

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.

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:

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.

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.

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).

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

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

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