C# klient bazy danych - klucz obcy

0

Witam
Mam do napisania aplikację, która będzie obsługiwać bazę danych stworzoną wcześniej przeze mnie (dodawanie rekordów, usuwanie, edycja, wyświetlanie). Schemat bazy w załączniku. Aplikację mam już w dużym stopniu napisaną (obsługuję 2 z 4 tabel) ale mam problem z tabelami, w których są klucze obce. Aplikację pisze w oparciu o ten poradnik: ; Według tego poradnika, mój kod na dodawanie rekordu powinien wyglądać tak:

private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection cs = new SqlConnection("Server=(local); Database=Ksiazki; Integrated Security=TRUE");
            SqlDataAdapter da = new SqlDataAdapter();
            da.InsertCommand = new SqlCommand("INSERT INTO Ksiazki VALUES (@tytul, @id_gatunku, @wydawnictwo, @rok_wydania)", cs);
            da.InsertCommand.Parameters.Add("@tytul", SqlDbType.VarChar).Value = textBox1.Text;
            da.InsertCommand.Parameters.Add("@id_gatunku", SqlDbType.Int).Value = textBox2.Text;
            da.InsertCommand.Parameters.Add("@wydawnictwo", SqlDbType.VarChar).Value = textBox3.Text;
            da.InsertCommand.Parameters.Add("@rok_wydania", SqlDbType.VarChar).Value = textBox4.Text;

            cs.Open();
            da.InsertCommand.ExecuteNonQuery();
            cs.Close();

        }
    }
}

Jak widać, jest tam klucz obcy, który wywala mi błąd "The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Ksiazki__id_gatu__08EA5793". The conflict occurred in database "Ksiazki", table "dbo.Gatunki", column 'id_gatunku'.
The statement has been terminated."

I nie wiem co dalej, czy w ogóle tak to ma wyglądać. Z baz danych jestem zielony, c# dopiero poznaję.

0

Parametr id_gatunku jest typu int, a Ty tam wstawiasz string z z tekstboxa: textBox2.Text.
Myślę, że powinieneś podawać tam int.
Po drugie, czemu użytkownik ma podawać id gatunku ręcznie? Widziałeś gdzieś takie rozwiązanie? Przecież tam powinien być użyty ComboBox, żeby użytkownik mógł wybrać sobie z ograniczonego zestawu wartości.
Po trzecie, nazywaj kontroli porządnie, a nie "textBox1".

0

Może mógłbyś naskrobać, jak to mniej więcej powinno wyglądać?
Masz rację co do id_gatunku, ale nie wiem za nic jak to zrobić, nie ogarniam jeszcze programowania na tyle by to poprawić.
Nazwy pozmieniam jak zacznie mi to działać.

0
Int32.Parse(textBox2.Text);
0

Witam ponownie.
Program działa jak należy, jednak mam inny problem. Wymagany jest panel logowania, który stworzyłem, jednak każdy user (który jest stworzony wcześniej w osobnej bazie danych) ma całkowity dostęp to programu (może dodawać, usuwać itp rekordy). Czy ktoś mógłby podpowiedzieć jak zrobić, by np user1 miał całkowity dostęp do programu, a user 2 tylko do odczytu (opcja Enabled buttonow ustawiona na false przy załadowaniu formatki)? Jakis if sprawdzający? Panel logowania robiłem wg. tego poradnika:

Czyli wygląda to tak: form1 to panel logowania, po zalogowaniu się pojawia się form2 z buttonami i w zależności od usera są one dostępne lub nie.

Jaśniej nie potrafię napisać o co mi chodzi.

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