Reklama
Pokazuje wyniki od 1 do 13 z 13

Temat: [C#, SQL] Aplikacja obsługująca bazę danych

  1. #1

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny [C#, SQL] Aplikacja obsługująca bazę danych

    Cześć, mam problem z napisaniem aplikacji która będzie obsługiwać bazę danych SQL. Finalna wersja to ma być dziennik szkolny, jednak póki co walczę z bardzo jego okrojoną wersją. Mam 2 tabele:
    Uczen
    -UczenID (PK)
    -Imie, nazwisko, nieistotne

    Ocena
    -OcenaID (PK)
    -UczenID (FK - do tabeli Uczen)
    -Ocena (float)

    oraz 1 widok
    Oceny (SELECT UczenID, Ocena FROM Ocena)
    czyli po prostu wyświetlanie oceny i id ucznia

    Ogólnie program wygląda mniej więcej tak:

    Przyciski Nauczyciel i Uczeń tylko aktywują lub dezaktywują opcję dodawania, no ale na tym poziomie raczej wszystko jest ok.

    Problem zaczyna się jak do ów bazy próbuje coś rzeczywiście dodać... nie mówiąc o tym, że po naciśnięciu + w menu dodawania, robi się niby możliwość dodania oceny, jednak ID automatycznie ustawia się na -1 a gdy ręcznie się wszystko ustawi to wyskakuje:


    Ponad to, gdy ręcznie próbuje wpisać nowe dane do tabeli Oceny


    O dziwo pierwsze 2 dały się wpisać.. błąd jest przy trzecim rekordzie...

    Tak wygląda utworzona przeze mnie relacja między Uczen(UczenID) a Przedmiot(UczenID)


    jakkolwiek to ustawiam to ciągle te same błędy... naprawdę nie mam pojęcia co jeszcze może być nie tak?

    aha jeszcze jedno, gdy wrzucę funkcję dodawania ucznia - mogę dodawać i kasować uczniów, działa wszystko poza tym że automatycznie ID ustawia na -1, -2 itd...

    edit#
    klucze głowne mają Identity Specification ustawione na YES, a Identity Seed i Increment na 1

    edit2#
    kodu żadnego nie wrzucałem bo wszystko praktycznie robię kliknięciami myszki... a kod w C# działa ok
    Ostatnio zmieniony przez hefalump : 17-01-2015, 18:35

  2. #2
    Avatar Absherr
    Data rejestracji
    2008
    Położenie
    Kraków
    Posty
    578
    Siła reputacji
    16

    Domyślny

    Uczeń i Ocena mają relację jeden do jednego, przez co nie da się dodać dwóch ocen dla tego samego ucznia?

  3. Reklama
  4. #3

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    a gdzie to mogę w VS 2010 zmienić?...
    ogólnie coś pozmieniałem, da się dodawać oceny jednak jak później chcę je obejrzeć to wywala System.ObjectDisposedException ... Cannot access a disposed object.

  5. #4
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    Ewidentnie masz problem z Foreign Keyem.

    Jaki ma sens w ogole tabela Ocena w ktorym jest FK na usera ;o

    odejdz od tego zjebanego pomyslu to problem sam sie rozwiaze

    irc: freenode.net in #torgdevs

  6. #5
    Avatar Absherr
    Data rejestracji
    2008
    Położenie
    Kraków
    Posty
    578
    Siła reputacji
    16

    Domyślny

    Czemu FK na Ucznia jest zjebanym pomysłem?

  7. #6

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    Problem w tym, że przedmiot "bazy danych" na naszej uczelni wyglądał tak, że przez 3/4 semestru pieprzyliśmy się ze słownymi opisami tego, ustalaniem ile będzie instancji danych problemów i innymi pierdołami a na koniec kazali nam napisać aplikacje która tę bazę obsłuży nam. Tak więc tabele, itp mam w poprzednich etapach już zaprojektowane. Mimo to drobne zmiany mogę wprowadzić i nie powinno być problemu... Tylko, że jak inaczej to połączyć? Chodzi tutaj o przypisanie oceny do ucznia (osoby, mniejsza z tym). Więc jak inaczej to zrobić niż dając jego ID jako FK?

    edit#
    W finalnej wersji miało być:
    Osoba (Idosoby, imie, nazwisko, bla bla bla) i dwie klasy "dziedziczące" - Uczeń(IDucznia, IDosoby(FK), IDklasy) i Nauczyciel(IDnauczyciela, IDosoby(FK)).
    Taki był pomysł prowadzącego by nasz projekt lepiej działał. Gdy coś takiego wrzuciłem do visuala to błędy się troiły w oczach...
    Postanowiłem zrobić coś takiego po prostu:
    Osoba
    -ID(PK)
    -imie, nazwisko, ...
    -Nauczyciel (true/false)

    Na potrzeby tego projektu całkowicie powinno to wystarczyć i nie robi niepotrzebnego zamieszania. Z tym, że nie mogę zrobić póki co nawet jeszcze bardziej okrojonej wersji
    Ostatnio zmieniony przez hefalump : 17-01-2015, 22:20

  8. #7
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    Cytuj Absherr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Czemu FK na Ucznia jest zjebanym pomysłem?
    bo tak mi się wydaje, ja bym to troche inaczej zaprojektował.
    @hefalump ;
    FK musi byc PK innej tabeli wiec upewnij się jakie masz wartosci w tabeli z uczniami i takimi wypelniaj oceny

    irc: freenode.net in #torgdevs

  9. #8

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    up#
    Tak, wiem ;/

    OK... brakuje mi powoli pomysłów ;D

    tak wygląda kod okienka z wyświetlaniem

    Kod:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    namespace Dziennikv3
    {
        public partial class pokazOcenyForm : Form
        {
    
            SqlConnection cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Maciej\Desktop\ZABAWA WCIAZ TRWA\v3\Dziennikv3\Dziennikv3\db9.mdf;Integrated Security=True;User Instance=True");
            SqlCommand cmd = new SqlCommand();
            SqlDataReader dr;
    
            public pokazOcenyForm()
            {
                InitializeComponent();
            }
    
            private void pokazOcenyForm_Load(object sender, EventArgs e)
            {
                 
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                cmd.Connection = cn;
                listBox1.Items.Clear();
                listBox2.Items.Clear();
                cn.Open();
                cmd.CommandText = "select IDucznia, Ocena from tableOcen";
                dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        listBox1.Items.Add(dr[0].ToString());
                        listBox2.Items.Add(dr[1].ToString());
                    }
                }
                cn.Close();
            }
        }
    }
    a tak z dodawaniem

    Kod:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    namespace Dziennikv3
    {
        public partial class dodajOcenyForm : Form
        {
            SqlConnection cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Maciej\Desktop\ZABAWA WCIAZ TRWA\v3\Dziennikv3\Dziennikv3\db9.mdf;Integrated Security=True;User Instance=True");
            SqlCommand cmd = new SqlCommand();
    
            public dodajOcenyForm()
            {
                InitializeComponent();
            }
    
            private void dodajOcenyForm_Load(object sender, EventArgs e)
            {
                cmd.Connection = cn;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (IDo.Text != "" & IDu.Text != "" & OCE.Text != "" )
                {
                    cn.Open();
    
                    
                    cmd.CommandText = "SET IDENTITY_INSERT tableOcen ON";
                    cmd.CommandText = "insert into tableOcen (IDocena, Ocena, IDucznia) values ('" + IDo.Text + "', '" + OCE.Text + "', '" + IDu.Text + "')";
                    cmd.CommandText = "SET IDENTITY_INSERT tableOcen OFF";
                    cmd.ExecuteNonQuery();
                    cmd.Clone();
                    const string message = "Ocena dodana pomyslnie.";
                    const string caption = "";
                    var result = MessageBox.Show(message, caption,
                                                 MessageBoxButtons.OK);
                    cn.Close();
    
                    IDo.Text = "";
                    IDu.Text = "";
                    OCE.Text = "";
                 }
                else
                {
                    const string message = "Nie udalo sie dodac oceny. Prosimy wypelnic wymagane pola: ID Oceny, ID ucznia, ocene i przedmiot.";
                    const string caption = "";
                    var result = MessageBox.Show(message, caption,
                                                 MessageBoxButtons.OK);
                }
            }
    
    private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
            {
                ListBox l = sender as ListBox;
                if (l.SelectedIndex != -1)
                {
                    listBox1.SelectedIndex = l.SelectedIndex;
                    listBox2.SelectedIndex = l.SelectedIndex;
                }
            }
          
        }
    }
    Robię to bez żadnych kluczów obcych itp... w sumie operacje wykonuje na 1 tablicy
    tableOcen (IDoceny[pk], Ocena, IDucznia)

    Wyświetlanie jak i dodawanie wydaje się działać. Dodaje jakies oceny do bazy ręcznie, włączam program, daje okienko wyswietl - działa.
    Daje okienko dodawania - dodaje mi oceny. Ale jeżeli po dodaniu ocen przez program, spróbuje wyświetlić oceny, dostaje to:



    jak jakimś cudem to nie wyskoczy - okazuje sie ze nie dodaje wcale tych ocen, albo po prostu ich nie wyswietla... w kazdym razie w listboxach mam tylko te oceny ktore dodalem recznie...

    down#

    robie to właśnie małymi krokami...
    aktualnie mam 1 studenta w bazie, z tym ze nie jest on i tak w zaden sposob powiazany z tabela ocen

    tak więc wszystkie operacje dodaje na tabeli Oceny gdzie mam jedynie
    klucz glowny IDoceny, Ocene(float) i IDucznia(int).
    gdzie identity specification na PK jest ustawiona na yes (seed i increment na 1)...

    jak miałbym zrobić automatyczne zwiekszanie ID o 1 ?
    Ostatnio zmieniony przez hefalump : 18-01-2015, 10:50

  10. #9
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    Porób wszystko małymi krokami a nie wszystko naraz! To pierwsza zasada dobrego programowania.

    Zrób sobie 4 uczniów i upewnij sie ze mają poprawne ID (od 1 do 4). Zaimplementuj to tak zebys nie musial z palca wpisywac ID ale automatycznie sie zwiakszalo o 1.
    nawet mozesz wyslac screena

    irc: freenode.net in #torgdevs

  11. #10

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    Ogolnie chyba poradzilem sobie z baza danych (pewnie i tak beda jakies problemy pozniej ^^)
    Poki co nie wiem jak poradzic sobie z C# i System.ObjectDisposedException. Cannot access a disposed object.

    Otoz zrobilem sobie interfejs, mam mainForm z przyciskami ootwierajacymi kolejne okienka (poki co puste). Problem sie pojawia, gdy otworze jakies okienko, zamkne je i pozniej znow je probuje otworzyc. Wyglada to tak jakby przy zamykaniu okienko program kasowal ten obiekt i nie byl on juz dostepny.... jak temu zaradzic?
    Okienka wyswietlam w taki sposob
    Kod:
    private void onClick_dodajOcene(object sender, EventArgs e)
            {
                frmDodajOceny.Show();
            }
    w okienku poki co nic nie ma, zmienilem jedynie nazwe na pasku...

  12. #11
    Avatar KrystianeK
    Data rejestracji
    2005
    Położenie
    .
    Wiek
    33
    Posty
    1,147
    Siła reputacji
    19

    Domyślny

    Możesz opisać problem trochę jaśniej? Albo wkleić wyświetlane błędy?
    Istnieje różnica między znajomością drogi, a podążaniem nią.

  13. #12
    Avatar TheSnake
    Data rejestracji
    2008
    Posty
    321
    Siła reputacji
    17

    Domyślny

    Jak zamykasz okno to obiekt jest niszczony. Musisz tworzyć formę za każdym razem, a nie tylko na początku programu/klasy.

    tam gdzie podkreślone możecie się przyjebać :>

  14. #13
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    albo przeciazyc event onClose zeby nie kasowal obiektu?

    irc: freenode.net in #torgdevs

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. baze danych
    Przez Terr w dziale O serwisie
    Odpowiedzi: 19
    Ostatni post: 15-10-2020, 13:23
  2. Autouzupełnianie się danych na podstawie innych danych w Excelu.
    Przez Scrath~ w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 1
    Ostatni post: 30-01-2014, 18:17
  3. [7.6]Acc Maker SQL
    Przez muszla99 w dziale Strefa developerska
    Odpowiedzi: 0
    Ostatni post: 14-03-2010, 03:25
  4. [8.54][forgottenserver.sql] - gdzie te cholestwo jest?
    Przez Avithor w dziale Strefa developerska
    Odpowiedzi: 13
    Ostatni post: 13-03-2010, 15:24

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •