Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C# - Kopiowanie tabeli z jednej bazy do drugiej

Przemo_2014 01 Lut 2013 13:09 3927 22
  • #1 01 Lut 2013 13:09
    Przemo_2014
    Poziom 19  

    Witam,

    Pisałem aplikację w oparciu o bazę danych mysql. Obecnie dane zawarte w bazie mysql chcę przenieść do bazy sql. Chodzi mianowicie o tabele przedstawione w bazie localhost i z stamtąd chciałbym je przenieść do bazy stock.mdf. Jak mogę tego dokonać wykorzystując środowisko visual studio.

    C# - Kopiowanie tabeli z jednej bazy do drugiej

    Pozdrawiam

    0 22
  • #2 01 Lut 2013 13:18
    Defice
    Poziom 25  

    Najprostsza metoda (niekoniecznie najlepsza) to zrobienie sobie mini aplikacji z komponentem DataGridView do którego podpinasz bazę MySQL. Następnie zawartość DataGridView wrzucasz do bazy mdf (do konkretnej tabeli).

    Minusy:
    - Musisz uprzednio utworzyć sobie tabelę w bazie MSSQL z identycznymi polami jak w MySQL.

    To tyle, miłej zabawy.

    P.S. Niektóre narzędzia zewnętrzne mogą zrobić to za Ciebie, nie pamiętam które dokładnie ale chyba MySQL Workbanch chyba ma nawet taką funkcję.

    0
  • #4 01 Lut 2013 14:34
    Defice
    Poziom 25  

    Jeżeli będziesz miał DataSet poprawnie wypełnionego to oczywiście. Natomiast, jeżeli będziesz chciał w ten sposób to realizować to DGV nie jest Ci w ogóle potrzebny. Ja miałem na myśli raczej to, by załadowane dane do DGV z MySQL pobierać bezpośrednio z DGV, a służyć on miał podglądowi danych.

    Tu jest inny sposób na przeniesienie bazy:

    http://www.codeproject.com/Articles/29106/Migrate-MySQL-to-Microsoft-SQL-Server

    0
  • #6 01 Lut 2013 15:49
    wiesniak
    Poziom 31  

    Nie rozumiem, po co Wam DataGridView, skoro jest to kontrolka do wizualizacji danych, a chodzi tylko o przeniesienie danych między bazami.
    Ja bym sobie wrzucił dwa modele Entity Framework do obu baz, dzięki czemu dostanę kolekcje odpowiadające tabelkom na bazach.
    Później pętelkami przepisać wartości z jednych kolekcji do drugich i gotowe. Żadnych DataSetów, żadnych selectów.

    0
  • #7 01 Lut 2013 15:59
    Przemo_2014
    Poziom 19  

    A możesz coś więcej o tym "Entity Framework", bo nigdy o czymś takim nie słyszałem jak do tej pory jak się z tego korzysta?

    ...

    Ok znalazłem artykuł z tym związany. Musze przyznać, że dość ciekawe zagadnienie.
    http://www.reset.ath.bielsko.pl/technologiene.../wprowadzenie-do-entity-framework-adonet.aspx

    0
  • #8 01 Lut 2013 16:17
    Defice
    Poziom 25  

    @wiesniak, dokładnie to miałem na myśli, czyli wizualizacje. Miałem pierwotnie pomysł na zrobienie aplikacji służącej do przenoszenia MySQL -> MSSQL gdzie będzie można podejrzeć sobie dane (choćby do sprawdzenia zawartości oraz nazw kolumn) a następnie wrzucenie jej do MSSQL.

    Co do Entity Framework, nie znałem i temu pewnie nie poleciłem. Przy okazji i ja się czegoś nauczę :)

    0
  • #10 01 Lut 2013 20:31
    wiesniak
    Poziom 31  

    Uf, zmajstrowałem przykładzik.
    W katalogu DB projektu mamy dwie bazy TestDB1 oraz TestDB2. Są one w zasadzie identyczne, posiadają tabelę Cars (wybaczcie język, to z przyzwyczajenia). Te tabele posiadają kolumnę Id (klucz główny), Name (unikalny indeks na kolumnie, bo czemu nie), Color.
    Do każdej z baz stworzyłem osobny model EF - oba modele znajdują się w katalogu Model. Co ciekawe, jako że namespace jest wspólny dla obu, klasa Car jest współdzielona przez oba modele.
    Connection stringi do baz zdefiniowane są w pliku app.config. I tu uwaga: ścieżki do plików zdefiniowałem ręcznie jako ścieżki bezwzględne (czyli aby poprawnie odpalić program, trzeba sobie zmienić ścieżki). Domyślnie tworzona jest ścieżka względna, przez co przy uruchomieniu debugu, brana jest baza z katalogu DB i tworzona jest jej kopia w katalogu wyjściowym. Wszystko działa ładnie, ale po ponownym uruchomieniu znów tworzona jest kopia i baza jest pusta. Oczywiście przy uruchomieniu z pliku exe, a nie z poziomu VS, problem nie powinien występować.
    Aby nie mieszać kodu obsługującego bazę z GUI, stworzyłem dwie klasy do obsługi baz - TestDB1DataManager oraz TestDB2DataManager.

    Na GUI, tak jak pisaliście, dodałem DGV, na których można podejrzeć dane oraz je modyfikować (dodawanie, usuwanie na pierwszym, edycja na obu gridach, przenoszenie grid1->grid2, czyszczenie grida 2).

    Przemo_2014 -> Odwołujesz się do pierwszego elementu - być może w tabeli masz tylko jeden element (na pozycji zerowej)?
    Porównaj Twój kod z moim, może coś się wyjaśni. Oczywiście w razie pytań do przykładu, postaram się odpowiedzieć.

    0
  • #11 02 Lut 2013 17:09
    Przemo_2014
    Poziom 19  

    "Entity Framework" faktycznie ułatwia pracę z bazami danych. Napisałem sobie programik który przepisze mi zawartość z jednej tabeli do drugiej i wyświetla skopiowana wartość w textbox-ie.

    C# - Kopiowanie tabeli z jednej bazy do drugiej

    Po zakończeniu aplikacji i sprawdzeniu zawartości database bezpośrednio z VS baza ta jest pusta. Co jest tego przyczyną ? Czy to znaczy że dane nie są do niej zapisywane na stałe ?

    -1
  • Pomocny post
    #12 02 Lut 2013 17:13
    wiesniak
    Poziom 31  

    1. SaveChanges możesz robić poza pętlą.
    2. Przeczytałeś to, co napisałem o ścieżkach do baz danych? Podejrzewam, że masz identyczny problem jak opisałem w poprzednim poście.

    0
  • #14 06 Lut 2013 18:57
    Przemo_2014
    Poziom 19  

    Jak stworzyć zapytanie które mi sprawdzi czy w bazie znajduje się dany element i pozwoli na jego update.

    Próbowalem w ten sposób ale do końca nie chce działać:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    pętla IF jest zawsze wykonywana niezależnie czy dany element istnieje czy nie.

    0
  • #15 06 Lut 2013 21:00
    wiesniak
    Poziom 31  

    Proponuję coś takiego:

    Kod: CSharp
    Zaloguj się, aby zobaczyć kod

    FirstOrDefault - weź pierwsze, które pasuje lub domyślną wartość (najczęściej null) jeśli nie znaleziono
    Single - weż jeden element pasujący do podanego wyrażenia. Jeśli elementów jest więcej, lub zero, rzuć wyjątkiem.
    Jest też SingleOrDefault - podobnie jak Single, tylko dla braku elementów zwraca null.
    Jak widać, jest drobna różnica między First, a Single i w większości wypadków First (lub FirstOrDefault) jest lepszym wyborem.

    0
  • #16 06 Lut 2013 21:11
    gaskoin
    Poziom 38  

    A nie możesz po prostu wyeksportować skryptów i ich odpalić na nowej bazie ... ? Od tygodnia walczysz z programem, gdzie byś to już dawno w ten sposób zrobił.

    0
  • #18 07 Lut 2013 19:33
    Przemo_2014
    Poziom 19  

    Mam mały problem z dodaniem noweych danych do bazy. Wykonuje to w taki sposób:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Ty natomiast użyłeś funkcji ADD(new_object) natomiast u mnie jest tylko AddObject(new_object).
    Gdy wykonuje się ostatnia funkcja smdf.SaveChanges(); dostaje informację że:

    C# - Kopiowanie tabeli z jednej bazy do drugiej

    Co to za dokładnie zmienna Identity_Insert bo to chyba tu jest problem i jak ją zmienić ? Szukałem we właściwościach bazy ale nie znalazłem takiego parametru.

    0
  • #19 07 Lut 2013 19:46
    wiesniak
    Poziom 31  

    Nie wiem jak masz zdefiniowaną tabelę. Zobacz w moim przykładzie na kolumnę Id - ona jest kluczem głównym i ma ustawione Identity, dzięki czemu kolejne wartości klucza głównego same się dodają.
    Screen z konfiguracji kolumny:
    C# - Kopiowanie tabeli z jednej bazy do drugiej

    0
  • #21 21 Lut 2013 19:34
    Przemo_2014
    Poziom 19  

    Aplikacja jest stworzona na podstawie bazy sql znajdującej się bezpośrednio na danym komputerze na którym działa aplikacja. Chciałbym teraz tą bazę przenieść na serwer a w aplikacji dokonać zmian tak żeby łączyła się z bazą na serwerze. W jaki sposób wskazać żeby aplikacja szukała bazy na serwerze a nie na danym komputerze ? Można to zrobić zmieniając tylko w jakiś sposób coś w metodzie EF (zdjęcie bieżącej bazy w pierwszym poście) ?

    0
  • #22 22 Lut 2013 01:04
    wiesniak
    Poziom 31  

    Powinieneś mieć zdefiniowany connection string do bazy w pliku konfiguracyjnym aplikacji (app.config). Wystarczy go zmienić i gotowe.

    0
  • #23 07 Mar 2013 16:29
    Przemo_2014
    Poziom 19  

    wiesniak napisał:
    Powinieneś mieć zdefiniowany connection string do bazy w pliku konfiguracyjnym aplikacji (app.config).


    W pliku tym mam możliwość zdefiniowania connection string na sztywno. A co jeśli chciałbym żeby login i hasło było przekazywane podczas działania aplikacji. Jak się odwołać do tego pliku ?

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Jeśli przez konstruktor prześlę nowy connection string (con_string) to zostanie on użyty zamiast connection string zdefiniowany app.config ?

    0