ADO DataTable czy DataSet + Comboboxy

0

witam

Ostatecznie zrezygnowałem z długiego wstępu jaki stworzyłem w pierwszej wersji tego postu. Potrzebuje pomocy przy :

  1. Prośba o doradzenie : Czy możliwe jest załadowanie całe relacyjnej bazy z relacjami i tabelami do DataSet-u, updatowanie ich podczas pracy programu i wywołanie procedury podmiany zmienionych danych ?
    W tym momencie dane ładowane są do DataTable w wyniku zapytania "SELECT * FROM TableX" co następnie prezentowane jest w DataGridView ( takie rozwiązanie powoduje ze comboboxy wypełniane są tylko danymi zwracanymi przez pytanie, reszta danych nie jest uwzględniana).

  2. Pierwszy punkt nawiązuje to głównego problemu a mianowicie wiązania danych z wiązaniem danych w comboboxach, program umożliwia edycje danych poprzez wybranie wartości z comboboxa, Jak wykorzystać comboboxy w relacyjnej bazie danych aby dostępne w nim były wszystkie dane dotyczące danego parametry(tabela relacyjna) , w wskazaniem na aktualny (selectedValue)? W tym momencie tworze dla niego osobny DataTable również "SELECT * FROM TableY".

Aktualne rozwiązanie nie jest eleganckie i polega na budowaniu kilku tabel poprzez wykonywanie "SELECT * FROM opdpowiednia_tabela)", i ładowanie ich do kolejnych kontrolek, co w rezultacie powoduje chaos i nieścisłość danych.

Jeśli nie jasno opisałem problem jutro w pracy zrobię screeny diagramu i okna aplikacji.

Bardzo zależy mi na pomocy.

Pozdrawiam

1

Ad. 1. Wydaje mi się, że zamiast kombinować w ten sposób, powinieneś obczaić hasło ORM.

0

@aurel nie mam zamiaru kombinować i stworzyć to najprostszą możliwą techniką.

A teraz konkretnie.

w załączniku screen fragmentu bazy.

a poniżej sposób jaki przyjołem :


    public static class StaticData
    {
        public static BindingSource BSource = new BindingSource();
        public static DataTable DTable = new DataTable();

        public static DataTable ComboDT1 = new DataTable();
        public static DataTable ComboDT2 = new DataTable();
        public static DataTable ComboDT3 = new DataTable();
        public static DataTable ComboDT4 = new DataTable();

    }

public partial class MainForm : Form
{
public BindingSource MyBS;
public Connection myConn; // clasa do obsługi bazy firmy.
public BindingSource MyBS

.
.
.
private void MainForm_Load(object sender, EventArgs e)
{
            try
            {
                myConn = new Connection(); // naawiązanie polaczenia
                myBS = new BindingSource(); 
                myDT = new DataTable();
                myDT = myConn.GetData("Select * from Badania"); // wykonanie zapytania

                myBS.DataSource = myDT;

                StaticData.BSource = myBS; // globalnie dostępne zmienne
                StaticData.DTable = myDT;

                this.dataGridView1.DataSource = myBS;
                this.dataGridView1.Columns["upsize_ts"].Visible = false;
                this.dataGridView1.Columns[0].Visible = false;
             }
}
}
// w ten sposób uzupełniam DataGridView

Przy wywołaniu formularza edycji uzupełniam danymi poprzez

 

private void EditForm_Load(object sender, EventArgs e)
        {

            StaticData.ComboDT1 = myConn.GetData("Select * from Instytucje");
            StaticData.ComboDT2 = myConn.GetData("Select * from Uprawy");
            StaticData.ComboDT3 = myConn.GetData("Select * from Status");
            StaticData.ComboDT4 = myConn.GetData("Select * from Osoby");

            this.maskedTextBox1.DataBindings.Add("Text", StaticData.BSource, "Rok");
            this.textBox1.DataBindings.Add("Text", StaticData.BSource, "Nazwa_badania");
            this.textBox2.DataBindings.Add("Text", StaticData.BSource, "Koszt_badania");
            this.textBox3.DataBindings.Add("Text", StaticData.BSource, "Uwagi");

            this.comboBox1.DataSource = StaticData.ComboDT1;
            this.comboBox1.DisplayMember = "Nazwa_instytucji";
            this.comboBox2.DataSource = StaticData.ComboDT2;
            this.comboBox2.DisplayMember = "Nazwa_uprawy";
            this.comboBox3.DataSource = StaticData.ComboDT3;
            this.comboBox3.DisplayMember = "Status";
            this.comboBox4.DataSource = StaticData.ComboDT4;
            this.comboBox4.DisplayMember = "Osoba_odpowiedzialna";
        }

Za pomocą comboboxów uzupełniam dane z zdefiniowanych "słowników" + mam możliwość dodania wpisów do baz relacyjnych przez "dodaj" obok parametrów.
Czy ma ktoś pomysł jak rozwiązać problem comboboxów tak aby ni trzeba było tworzyć dla nich osobnych Datatable ?

Marzy mi się sposób w którym na początku ładowany byłby DataSet z wszystkimi danymi w bazie, z niego uzupełniane były by dane w kontrolkach, na nim były by przeprowadzane zmiany i dodawanie danych a na koncu wszystko by się updatowało. nie przewiduję aby baza urosła do jakiś olbrzymich rozmiarów.

Proszę o pomoc.

1

@aurel nie mam zamiaru kombinować i stworzyć to najprostszą możliwą techniką.

Do tego co chcesz osiągnąć, ORM będzie najprostszą możliwą techniką.
Najtrudniejsze będzie przełamanie się i zapoznanie się z nową technologią :)

Nie pomogę ci w szczegółach, ponieważ akurat w dotNecie jeszcze mi się nie zdarzyło żadnego ORMa stosować, ale z prostych wskazówek:

  1. Raz skonfigurujesz dobrze, to będzie ci sam dbał o pobieranie i updatowanie danych. Jak widzę serię takich zapytań:
    Select * from Badania
    Select * from Instytucje
    Select * from Uprawy
    Select * from Status
    Select * from Osoby

...to od razu mam podejrzenie, że architektura aplikacji mogłaby być lepsza. Pobierasz z bazy WSZYSTKO. Aż się prosi o ORM.

  1. Nie będziesz musiał wcale korzystać z DataTable, nie wspominając już o tworzeniu oddzielnego DataTable dla każdego zapytania. Do ComboBoxa jako DataSource nie trzeba podpinać DataTable, to może być zwykła lista, a dzięki ORM będziesz miał listę obiektów typu badania, listę obiektów typu instytucje, listę obiektów typu uprawy itd. bez konieczności każdorazowego ich pobierania, bez paskudnej klasy public static class StaticData, która jest niczym innym jak zmienną globalną (ZŁOOO :P).

Jeżeli mimo moich argumentów, nie czujesz/nie lubisz/nie chcesz ORMa zastosować - musisz robić tak jak robisz. A już sam zauważyłeś, że jest to rozwiązanie nieeleganckie i powodujące nieścisłość danych...

1

Polecam Ci ORM. Tworzy się o wiele mniej błędów przy zapytaniach, łatwo się dodaje/usuwa dane.

0
tiger188 napisał(a)

@aurel nie mam zamiaru kombinować i stworzyć to najprostszą możliwą techniką.

Tzn. wolisz nie kombinować i użyć najgorszej możliwej?
Żeby to chociaż jeszcze był typowany DataSet, a Ty używasz własnoręczniemontowanego.

Najprostsza możliwa technika dostępu do bazy MSSQL w .NET to LINQ to SQL. Dodaj sobie do projektu źródło danych LINQ, połącz się kreatorem z bazą, przeciągnij tabele i dostaniesz automatycznie wygenerowane klasy, oraz metody pozwalające pobierać, zapisywać i usuwać obiekty tych klasy z bazy.

0

somekind: nie linq to sql tylko entity framework jeśli już. Linq to SQL zresztą chyba nawet nie rozwijane z tego co dobrze kojarzę.

0

Może być i EF, korzysta się chyba bardzo podobnie. Sam nigdy nie używałem, więc polecam to, z czym mam doświadczenie. ;)

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