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

[C#] - Insert into, delete from, update - tryb bezpołączeniowy

tiger1990 25 Wrz 2012 00:26 1965 9
  • #1 25 Wrz 2012 00:26
    tiger1990
    Poziom 12  

    Witam,

    Czy mógłby ktoś napisać najprostsze zapytanie insert into, delete i update w trybie bezpołączeniowym? Szukałem w necie ale wszędzie tylko tryb połączeniowy, który mi za bardzo nie odpowiada.

    Irek

    0 9
  • CControls
  • #2 25 Wrz 2012 07:58
    marcinj12
    Poziom 40  

    Tuaj jest przykład typowego użycia - wykorzystujesz metodę Fill klasy DataAdapter do wypełnienia tabeli (SELECT) w datasecie oraz Update, do propagowania zmian z powrotem do bazy danych (UPDATE, INSERT i DELETE). Jeżeli tabela jest podpięta do DataGridView z możliwością edycji danych w komórce, to domyślnie zmiana wartości w DataGridView powoduje też zmiany w datasecie.

    0
  • CControls
  • #3 25 Wrz 2012 12:16
    tiger1990
    Poziom 12  

    U mnie jest trochę inaczej - bo wyłączyłem dodawanie, usuwanie i edycje wierszy w datagridview. Zamiast tego mam formatkę dodaj, w której są textboxy które wypełniam i teraz muszę jakoś dodać do bazy danych.

    0
  • #4 25 Wrz 2012 13:01
    marcinj12
    Poziom 40  

    Zasada działania będzie taka sama - tylko że do tabeli (DataTable) musisz dodać wiersz "ręcznie" poleceniem:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    , a potem wywołać polecenie Update() data adaptera. SQLowy Update czy Delete sprowadza się do odszukania odpowiedniego wiersza w tabeli (obiekt typu DataRow) i jego usunięciu bądź zmodyfikowaniu.

    0
  • #5 25 Wrz 2012 22:07
    tiger1990
    Poziom 12  

    Czyli mam rozumieć że jak chce zrobić update - zmieniam dane w data_table a potem wywołuje update(ds,"table name") Jak insert to dodaje wiersz i robie wtaki sam sposób insert a jak delete to wywalam wiersz z data_table i wywołuje delete(ds,"table name").

    2. Co będzie szybsze: z
    - robienie dodawania do tabeli w taki sposób że za każdym razem będe robił select do data seta i potem dopiero insert,
    -czy zrobienie tego w trybie połączeniowym używające execute query?

    0
  • #6 25 Wrz 2012 22:42
    marcinj12
    Poziom 40  

    tiger1990 napisał:
    Czyli mam rozumieć że jak chce zrobić update - zmieniam dane w data_table a potem wywołuje update(ds,"table name") Jak insert to dodaje wiersz i robie wtaki sam sposób insert a jak delete to wywalam wiersz z data_table i wywołuje delete(ds,"table name").
    Tak.
    tiger1990 napisał:
    Co będzie szybsze: z
    - robienie dodawania do tabeli w taki sposób że za każdym razem będe robił select do data seta i potem dopiero insert,
    -czy zrobienie tego w trybie połączeniowym używające execute query?
    A czy to ma jakiekolwiek znaczenie?? :D Jeżeli chcesz mieć tryb bezpołączeniowy, i tak nie masz wyjścia...

    Tryb bezpołączeniowy przydaje się w takiej przykładowej sytuacji: klient z laptopem albo innym urządzeniem przenośnym podłącza się do sieci, synchronizuje swoją aplikację z główną bazą danych (robi SELECT metodą Fill dataadaptera), odłącza się od sieci i idzie "w teren" pracować na kopii bazy. Wprowadza nowe rekordy lub modyfikuje istniejące nie mając dostępu do sieci, a na koniec dnia wpina się do sieci ponowniei synchronizuje swojego laptopa z główną bazą danych (wykonuje metodę Update), aby zrzucić wyniki swojej pracy do głównej bazy.

    Są co najmniej trzy niedogodności takiego rozwiązania:
    1. W przypadku awarii zasilania czy błędu w aplikacji - niezapisane dane z dataseta w pamięci są tracone.
    2. Pracując na kopii danych w pamięci dane mogą być już nieaktualne.
    3. Operacje na danych w pamięci, odszukiwanie rekordów będą najprawdopodobniej wolniejsze niż bezpośrednio na bazie - wszak dataset to nie baza danych.

    Ja osobiście mając wybór nigdy nie używam trybu bezpołączeniowego - zwykłe metody ADO są na tyle szybkie, a połączenie do bazy nawet po zamknięciu jest błyskawicznie dostępne z connection poola, że metoda:
    otwórz połączenie -> wykonaj zapytanie -> zamknij połączenie sprawdza się dobrze.

    0
  • #7 25 Wrz 2012 22:53
    tiger1990
    Poziom 12  

    Zaczynasz mnie przekonywać do trybu połączeniowego...

    Dobra w takim razie - w trybie bezpołączeniowym mam data seta i potem data table na których wykonuje operacje.

    W trybie bezpołączeniowym mam data reader. Czy mogę używając datareadera odwołać się tak: datareader[kolumna][wiersz] do danych?

    0
  • Pomocny post
    #8 25 Wrz 2012 23:21
    marcinj12
    Poziom 40  

    To się wszystko przeplata... Ten cały "tryb bezpołączeniowy" polega tak naprawdę na tym, że dataadapter "sam" decyduje, kiedy połączenie otworzyć, a kiedy zamknąć. "Sam" w cudzysłowie, bo to Ty metodami Fill czy Update pośrednio o tym decydujesz. Możesz robić to samo w róznych momentach w trybie połączeniowym za pomocą connection.open() i connection.Close() czy .Dispose() (a najlepiej używając using {} z połaczeniem) - według zasady, że połączenie należy otworzyć jak najpóźniej, a zamknąć jak najwcześniej jest to możliwe.

    Nic nie stoi na przeszkodzie, żeby w trybie połączeniowym użyć DataTable czy nawet całego DateSetu, a nawet DataAdaptera. DataReader jest tylko jedną z opcji odczytu danych. Ja np. często stosuję taką metodę odczytu danych w trybie połączeniowym:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Metoda Fill dataadaptera sama tworzy mi tabelę, wstawia i nazywa kolumny. Potem tą tabelę możesz dalej wykorzystać w kodzie - podpiąć do datagridview lub odwoływać się do wartości w formie: dataTable.Rows[wiersz][kolumna].

    Dla kompletu: INSERT, UPDATE i DELETE możesz sobie zrealizować za pomocą metod podobnych do tej:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    DataReader przydaje się, kiedy chcesz odczytać wiele wierszy z tabeli i dla każdego wykonać jakąś operację, np. stworzyć listę dla comboboxa z jakiegoś pola.

    0
  • #9 25 Wrz 2012 23:26
    tiger1990
    Poziom 12  

    W każdej z tych funkcji masz conn.Open() nie powinno być gdzieś conn.Close?

    I jeszcze zapytam co oznacza zapis:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    oraz

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Sorry że pytam o podstawy, ale pierwszy raz widzę.

    0
  • Pomocny post
    #10 25 Wrz 2012 23:31
    marcinj12
    Poziom 40  

    tiger1990 napisał:
    W każdej z tych funkcji masz conn.Open() nie powinno być gdzieś conn.Close?
    Jeżeli używasz using { }, które na końcu wywołuje metodę sprzątającą .Dispose() [lub sam ją wywołujesz] - to nie musisz, bo ona niejawnie wywołuje .Close().

    tiger1990 napisał:
    I jeszcze zapytam co oznacza zapis:

    Kod C# - [rozwiń]
    return cmd.ExecuteNonQuery() == 1;
    Uproszczenie zapisu w tym konkretnym przypadku - ponieważ mam funkcję zwracającą true lub false, która robi UPDATE po niepowtarzalnym numerze id, spodziewam się że polecenie ExecuteNonQuery() zwróci w wyniku 1. Jeżeli tak będzie, całe wyrażenie przybierze wartość true, co znaczy że zapytanie przebiegło poprawnie i można to dalej jakoś wykorzystać w kodzie. Jeżeli zwróci wartość 0 (bo np. ktoś inny w międzyczasie ten rekord usunął) - wyrażenie przybierz wartość false.

    Wtedy mogę napisać:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0