DataGridView + SQL

0

Witam wszystkich. Potrzebuję zrobić program w C#, który będzie sprawdzał dwie tabele ze sobą i gdy jedna z nich się zmieni program będzie updateował/dodawał odpowiednie jednej z tabeli (Wszystko będzie jednostronnie tzn. tylko jedna tabela będzie się zmieniała ). Pytanie jak to zrobić? Mam pomysł z DataGridView : dane z jednej tabeli "zassać" np. do datagridview1, a do datagridview2 drugą. W datagridview3 byłyby różnice ( czyli dane do update/insertu ). Nie wiem jak zabrać się za porównanie tabel i "wrzucenie" ich do datagridview3. Utknąłem na tym, że pobrałem dane z tabel do dgv1 i dgv2. Następne pytanie zrobiłem Form1 i dodałem klasę do projektu. Jest możliwość aby w klasie były widoczne funkcje z Form1 ( chodzi mi o DataGridView ). Z góry dziękuję za pomoc :).

0

Brak chęci do pomocy? :(

1

Witam,

A po co chcesz do tego używać DataGridView? Wystarczy dobrze przygotować dane, dodajesz kolumny z datą ostatniej modyfikacji w jednej i drugiej tabeli i synchronizujesz. Na upartego można zrobić to na poziomie bazy danych albo jakiegoś skryptu.

Pozdrawiam,

mr-owl

0

Dzięki za odpowiedź, niestety porównywanie na poziomie bazy danych odpada, choć wiem, że byłoby to jedno z lepszych/łatwiejszych rozwiązań ( przynajmniej jak dla mnie ).

0

Witam,

Może podaj przykład struktury bazy danych którą chcesz porównać

Pozdrawiam,

mr-owl

0

Podam przykład tabeli na której przeprowadzam testy :

CREATE TABLE [dbo].[uzytkownik](
[id] [int] IDENTITY(1,1) NOT NULL,
[imie] varchar NOT NULL,
[nazwisko] varchar NOT NULL,
[plec] varchar NOT NULL,
[wiek] [int] NOT NULL,
[kraj] varchar NOT NULL,
[data_ur] [date] NOT NULL,
[stanowsiko] varchar NULL

Ale wydaje mi się, że struktura jest tutaj mało istotna.

0

To jak chcesz dane synchronizować jeśli nie zwracając uwagi na strukturę? Poza tym podaj kształt obu tabel jak i jakieś szczegóły na temat lokalizacji danych.

Pozdrawiam,

mr-owl

P.S. Te VarChar (zamiast NVarChar) to tak celowo czy przez przypadek?

0

Tabele są zbudowane tak samo, wiem że do int nie mogę wrzucić varchara wiadomo. Tak w roli wyjaśnienia jedna tabela będzie kopią drugiej tabeli, ale tylko jedna tabelę będzie użytkownik zmieniał sam. Do tego chce zrobić program który będzie weryfikował czy coś się w tej tabeli użytkownika zmieniło i wrzucać ją do drugiej tabeli. Tak jak wspomniałem wcześniej wszelakie zapytania z poziomu np sql manangment studio odpadają, WSZYSTKO ma się robić za pomocą C# -> LINQ.

1

Witam,

Czy będzie więcej niż jeden użytkownik? Bo jeśli tak to już na dzień dobry może być rozjazd w id

Pozdrawiam,

mr-owl

0
Szalony napisał(a):

Tabele są zbudowane tak samo, wiem że do int nie mogę wrzucić varchara wiadomo. Tak w roli wyjaśnienia jedna tabela będzie kopią drugiej tabeli, ale tylko jedna tabelę będzie użytkownik zmieniał sam. Do tego chce zrobić program który będzie weryfikował czy coś się w tej tabeli użytkownika zmieniło i wrzucać ją do drugiej tabeli. Tak jak wspomniałem wcześniej wszelakie zapytania z poziomu np sql manangment studio odpadają, WSZYSTKO ma się robić za pomocą C# -> LINQ.

  1. Po co do tego program z GUI?
  2. Nie potrzebujesz SQL Management Studio do uruchamiania zapytań SQL, równie dobrze może to robić Twój program.
  3. LINQ nie ma nic wspólnego z bazami danych.
0
  1. bo tak naprawde dwie tabele są na innych sterownikach bazodanowych, z których jedna korzysta z innego języka ( wcale nie musi być program z GUI i praktycznie ingerencji z użytkownikiem to nie będzie miało więc GUI odpadnie )
  2. Do tego właśnie zmierzam
  3. "LINQ stanowi warstwę abstrakcji nad różnymi źródłami danych. Baza danych i jej elementy traktowane są również jak obiekty. Przestrzenie, które obsługuje LINQ, to:

obiekty implementujące interfejs IEnumerable<T>
bazy danych
język XML"
Z wikipedii

Ja napisałem tutaj swoją opinie jak JA bym to zrobił i chciałbym żeby ktoś udzielił się i pomógł mi to zrobić bądź powiedział : "słuchaj można zrobić to lepiej ...." i wyjaśnił jak. Nie trzymam się stricte swojego planu więc jeśli macie coś lepszego/łatwiejszego to proszę o podzielenie się :) Super by było podać przykład w postaci kodu to by mi "rozświetliło drogę w tunelu"

0
Szalony napisał(a):
  1. bo tak naprawde dwie tabele są na innych sterownikach bazodanowych, z których jedna korzysta z innego języka ( wcale nie musi być program z GUI i praktycznie ingerencji z użytkownikiem to nie będzie miało więc GUI odpadnie )

W takim razie opieranie programu na komponencie GUI, jakim jest DataGridView nie po prostu ma sensu.

  1. "LINQ stanowi warstwę abstrakcji nad różnymi źródłami danych. Baza danych i jej elementy traktowane są również jak obiekty. Przestrzenie, które obsługuje LINQ, to:

obiekty implementujące interfejs IEnumerable<T>
bazy danych
język XML"
Z wikipedii

Wikipedia jest pełna skrótów myślowych i bezmyślnych. ;)
LINQ nie obsługuje baz danych sam z siebie, potrzebuje po pierwsze czegoś, co konwertuje dane z bazy na obiekty (czyli ORMa), po drugie czegoś, co skonwertuje zapytania LINQ na API ORMa albo SQL, czyli LINQ providera.

Ja napisałem tutaj swoją opinie jak JA bym to zrobił i chciałbym żeby ktoś udzielił się i pomógł mi to zrobić bądź powiedział : "słuchaj można zrobić to lepiej ...." i wyjaśnił jak. Nie trzymam się stricte swojego planu więc jeśli macie coś lepszego/łatwiejszego to proszę o podzielenie się :) Super by było podać przykład w postaci kodu to by mi "rozświetliło drogę w tunelu"

No ale jak Ci pomóc, jak nie podajesz żadnych szczegółów?

Skopiowanie danych z tabeli do tabeli to jedno zapytanie SQL w rodzaju insert into Target select ... from Source where .... I to wszystko. Sprawa trochę się komplikuje jeśli potrzebujesz jakichś konwersji danych, albo operowania na kilku serwerach albo bazach danych różnych producentów. Ale Ty nie napisałeś nawet takich informacji.
Takie zapytanie może być uruchomione z poziomu aplikacji, ale jeżeli cały program ma być jedynie wywołaniem jednego SQLa, to nie ma on sensu. Pisanie aplikacji opartej na jakimś ORMie z LINQ po to, aby zrobić coś, co można zrobić czystym SQLem również nie ma sensu.

Jeśli chcesz pomocy, to napisz dokładnie - co chcesz osiągnąć i w jakim środowisku ma to działać.

0

Więc tak tabele będą pobierane z dwóch serwerów, jednym z serwerów jest SQL Server drugi jest napisany w innym języku niż SQL ( ale te zadanie jak to zrobić itp. zrobię sam ). Nie potrzebuje nic konwertować jeśli chodzi o strukturę danych w jedna jak i druga tabela będzie identyczna pod względem strukturalnym. Różnica będzie w ilości bądź modyfikacji już istniejących wierszy w tabeli. Więc reasumując są dwie tabele ( załóżmy że obie są w SQL, zapytanie w SQL jak napisałeś "insert into 'Target'.." odpada bo jak napisałem jest to inny język niż SQL, więc chce to zrobić za pomocą C# ), do jednej z nich użytkownik ma dostęp drugi jest ukryty przed użytkownikiem. W tabeli, gdzie użytkownik ma dostęp modyfikuje bądź dodaje dane, a ja potrzebuje tym programem sprawdzać oby dwie tabele i jeżeli zaszły jakieś zmiany modyfikować by były one równe. Możemy w sposób ułatwienie przyjąć iż dane są w SQL oraz tabele są w jednej bazie danych. Z modyfikacją sobie dam rade. Pozdrawiam i dzięki za pomoc.

0

Co to za baza, która ma tabele, a jednocześnie nie jest kompatybilna z SQL?

Możemy w sposób ułatwienie przyjąć iż dane są w SQL oraz tabele są w jednej bazie danych.

Przy takim uproszczeniu prawidłowym jest rozwiązanie: insert into select from. Tłumaczę - nie upraszczaj, napisz DOKŁADNIE o co Ci NAPRAWDĘ chodzi.

A co do LINQ - to jak już wybierzesz dane z tych dwóch "tabel", to wystarczy chyba porównać czy obiekty o tych samych ID mają te same wartości swoich pól. Albo nadpisać tymi danymi, które uznajesz za aktualne. W sumie, nie podałeś nawet zasad wg których chcesz przeprowadzać aktualizację.

1 użytkowników online, w tym zalogowanych: 0, gości: 1