Fremdschlüssel in Datenbank (Access) einfügen.

  • C#

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Fremdschlüssel in Datenbank (Access) einfügen.

    Ich versuche ein Programm (Buchdatenbankprogramm) welches ich heruntergelaen habe zu erweitern.
    Die vorhandene Tabelle book erweiterte ich um das Attribut bzw den Fremdschlüssel kategorieID.
    Im Programm habe ich eine Combobox hinzugefügt die die Werte aus der Tabelle kategorie einlesen.

    Wenn ein Datensatz eingefügt wird soll der Fremdschlüssel aus der Tabelle kategorie geholt werden, dessen kategorieName ausgewählt wurde.

    Wenn ich ein Datensatz einfügen möcht (insertbutton)gibt es ein Fehler bei der Zeile 31:
    int temp = oleDbCmd.ExecuteNonQuery();

    OleDBexception was unhandled
    Die Abfrage muss mindestens auf einer Tabelle oder Abfrage basieren.

    Was könnte das Problem sein ?

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Windows.Forms;
    9. using System.Data.OleDb;
    10. namespace TutorialConnectToAccessDB
    11. {
    12. public partial class FormMain : Form
    13. {
    14. private OleDbConnection bookConn;
    15. private OleDbCommand oleDbCmd = new OleDbCommand();
    16. private String connParam = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=book.accdb;Persist Security Info=False";
    17. public FormMain()
    18. {
    19. InitializeComponent();
    20. bookConn = new OleDbConnection(connParam);
    21. bookConn.Open();
    22. oleDbCmd.Connection = bookConn;
    23. fillcmbKategorie();
    24. }
    25. private void buttonInsert_Click(object sender, EventArgs e)
    26. {
    27. oleDbCmd.CommandText = "INSERT INTO book (bookName, description, kategorieID) VALUES ('" + this.textBoxBookName.Text + "','" + this.textBoxDescription.Text + "', (SELECT ID FROM kategorie WHERE kategorieName ='"+ cmbKategorie.SelectedItem.ToString() + "'));";
    28. int temp = oleDbCmd.ExecuteNonQuery();
    29. if (temp > 0)
    30. {
    31. textBoxBookName.Text = null;
    32. textBoxDescription.Text = null;
    33. cmbKategorie.SelectedItem = null;
    34. MessageBox.Show("Record Successfuly Added");
    35. }
    36. else
    37. {
    38. MessageBox.Show("Record Fail to Added");
    39. }
    40. bookConn.Close();
    41. }
    42. private void buttonShowAll_Click(object sender, EventArgs e)
    43. {
    44. dataGridView1.DataSource = null;
    45. dataGridView1.Rows.Clear();
    46. dataGridView1.Refresh();
    47. OleDbDataAdapter dAdapter = new OleDbDataAdapter("SELECT * FROM book", connParam);
    48. OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(dAdapter);
    49. DataTable dataTable = new DataTable();
    50. DataSet ds = new DataSet();
    51. dAdapter.Fill(dataTable);
    52. for (int i = 0; i < dataTable.Rows.Count; i++)
    53. {
    54. dataGridView1.Rows.Add(dataTable.Rows[i][0], dataTable.Rows[i][1], dataTable.Rows[i][2]);
    55. }
    56. dataGridView1.Update();
    57. }
    58. private void fillcmbKategorie()
    59. {
    60. oleDbCmd.CommandText = "SELECT * FROM kategorie";
    61. OleDbDataReader reader = oleDbCmd.ExecuteReader();
    62. while (reader.Read())
    63. {
    64. cmbKategorie.Items.Add(reader["kategorieName"].ToString());
    65. }
    66. reader.Close();
    67. }
    68. }
    69. }


    Tabellen:
    book
    ID
    bookName
    description
    kategorieID

    kategorie
    ID
    kategorieName
    Mit diesem Ansatz machst du dir enorm Arbeit, und verbaust dir gleichzeitig die Nutzung der tollen Konzepte, die Ado.Net eiglich für Datenbänker bereit hält.

    Schon deine Architktur - da kommunizieren Textboxen direkt mit der Datenbank - auwei, in 3 Dimensionen!

    Also Ado-Architektur sieht vor, im Client ein Abbild der DB zu haben, und auf diesem Abbild herumzuorgeln. Das Abbild heißt "typisiertes Dataset".
    Dataset verfügt über eine Änderungsverfolgung, sodass du zu beliebigen Zeitpunkten speichern kannst, etwa wenn der User den Save-Button drückt.
    Und dabei wird nicht nur das grade Editierte gespeichert, sondern alle Änderungen seit dem letzten Speichern.
    Also Ado.Net hat ein Dokumenten-Artiges Konzept: Wie ein Word-Dokument lädtst du die Daten, nimmst endlos Veränderungen vor, und - Save - Done.

    Ein anneres Ado.Net-Konzept ist Databinding - guck dir mal vier Views-Videos an, wie man binding-getriebene stabile Oberflächen erstellt.

    Beachte insbesondere, das die Samples dort (wenn Speichern implementiert ist), das volle CRUD unterstützen - Create, Read, Update, Delete - und zwar für alle Tabellen und jeden Datensatz.
    Und das mit weniger Code als du jetzt schon hast, wo du gradmal ein Create für gradmal einen Datensatz hast, und funzt nichtmal, und gehört verboten, da es zu Sql-Injection-Angriffen gradezu auffordert.