2016-05-06 19 views
1

Ich habe ein Schulprojekt und ich muss Daten zu 3 Tabellen hinzufügen, die miteinander verwandt sind. Mein Problem ist, dass der Primärschlüssel mit dem anderen verknüpft ist und ich einen Fehler erhalte.Zusätzliche Informationen: Sie können einen Datensatz nicht hinzufügen oder ändern, weil ein verwandter Datensatz in Tabelle 'tblRubriek' erforderlich ist.

Dies ist mein Code, den ich laufen bin

Protected Sub bntVerzenden_Click(sender As Object, e As EventArgs) Handles bntVerzenden.Click 


    Dim intGebruikersID, intRubriekID As Integer 
    Dim VerkopenConn As New OleDb.OleDbConnection 
    Dim VerkopenCommArtikel, VerkopenCommGebruiker, GebruikersIDComm, RubriekIDComm As New OleDb.OleDbCommand 


    VerkopenConn.ConnectionString = My.Settings.SvShopConnection 
    VerkopenCommArtikel.Connection = VerkopenConn 
    VerkopenCommGebruiker.Connection = VerkopenConn 
    GebruikersIDComm.Connection = VerkopenConn 
    RubriekIDComm.Connection = VerkopenConn 


    'Gebruiker gegevens aan de database toevoegen 
    VerkopenCommGebruiker.CommandText = "INSERT INTO tblGebruiker (GebruikersNaam, GebruikersVoornaam, GebruikersEmail, GebruikersGSM) VALUES (@GebruikersNaam, @GebruikersVoornaam, @GebruikersEmail, @GebruikersGSM)" 

    VerkopenCommGebruiker.Parameters.AddWithValue("@GebruikersNaam", txtNaam.Text) 
    VerkopenCommGebruiker.Parameters.AddWithValue("@GebruikersVoornaam", txtVNaam.Text) 
    VerkopenCommGebruiker.Parameters.AddWithValue("@GebruikersEmail", txtEmail.Text) 
    VerkopenCommGebruiker.Parameters.AddWithValue("@GebruikersGSM", txtGsm.Text) 


    'GebruikersID uit de database halen 
    GebruikersIDComm.CommandText = "SELECT tblGebruiker.GebruikersID FROM tblGebruiker WHERE tblGebruiker.GebruikersNaam = @Naam AND tblGebruiker.GebruikersVoornaam = @VNaam;" 

    GebruikersIDComm.Parameters.AddWithValue("@Naam", txtNaam.Text) 
    GebruikersIDComm.Parameters.AddWithValue("@VNaam", txtVNaam.Text) 

    'RubriekID uit de database halen 
    RubriekIDComm.CommandText = "SELECT tblRubriek.RubriekID FROM tblRubriek WHERE tblRubriek.RubriekNaam = @RubriekNaam" 

    RubriekIDComm.Parameters.AddWithValue("@RubriekNaam", lstRubriek.SelectedItem.ToString) 


    'Artikel gegevens aan de database toevoegen 
    VerkopenCommArtikel.CommandText = "INSERT INTO tblArtikel (ArtikelBeschrijving, ArtikelPrijs, RubriekID, ArtikelAankoopdatum, ArtikelTekoopgezet, ArtikelBeschikbaar, GebruikersID) VALUES (@ArtikelBeschrijving, @ArtikelPrijs, @RubriekID, @ArtikelAankoopdatum, @ArtikelTekoopgezet, @ArtikelBeschikbaar, @GebruikersID)" 

    VerkopenCommArtikel.Parameters.AddWithValue("@ArtikelBeschrijving", txtArtikelBeschrijving.Text) 
    VerkopenCommArtikel.Parameters.AddWithValue("@ArtikelPrijs", txtArtikelPrijs.Text) 
    VerkopenCommArtikel.Parameters.AddWithValue("@RubriekID", intRubriekID) 
    VerkopenCommArtikel.Parameters.AddWithValue("@ArtikelAankoopdatum", CalAankoop.SelectedDate) 
    VerkopenCommArtikel.Parameters.AddWithValue("@ArtikelTekoopgezet", calVerkoop.SelectedDate) 
    VerkopenCommArtikel.Parameters.AddWithValue("@ArtikelBeschikbaar", True) 
    VerkopenCommArtikel.Parameters.AddWithValue("@GebruikersID", intGebruikersID) 

    If VerkopenConn.State = ConnectionState.Closed Then VerkopenConn.Open() 
    VerkopenCommGebruiker.ExecuteNonQuery() 
    intGebruikersID = Integer.Parse(GebruikersIDComm.ExecuteScalar) 



    intRubriekID = Integer.Parse(RubriekIDComm.ExecuteScalar) 



    VerkopenCommArtikel.ExecuteNonQuery() 






End Sub 

Bei VerkopenCommArtikel.ExecuteNonQuery() Muss ich diesen Fehler empfangen

Eine Ausnahme vom Typ 'System.Data.OleDb.OleDbException' aufgetreten in System.Data .dll wurde aber nicht im Benutzercode behandelt

Weitere Informationen: Sie können einen Datensatz nicht hinzufügen oder ändern, da ein zugehöriger Datensatz in der Tabelle 'tblRubriek' erforderlich ist.

This is my Database

+0

Wenn die PK in der übergeordneten Tabelle von der Datenbank generiert wird, müssen Sie diese in der untergeordneten Tabelle abrufen, bevor Sie sie speichern. Siehe meinen Leitfaden dazu hier: http://www.vbforums.com/showthread.php?659052-Retrieve-Access-AutoNumber-Value-After-Insert&highlight= – jmcilhinney

+0

@jmcilhinney danke! Ich denke, ich habe es bereits geschafft, dieses Problem zu lösen, aber jetzt stieß ich auf dieses Problem. –

+0

Bevor Sie versuchen, in 'Integer' zu konvertieren, müssen Sie möglicherweise zuerst prüfen, ob 'ExecuteScalar'' DBNull' zurückgegeben hat, was passieren könnte, wenn die Abfrage keine Zeilen zurückgibt. –

Antwort

1

Sie verwenden

intRubriekID = Integer.Parse(RubriekIDComm.ExecuteScalar) 

den intRubriekID Wert nach Sie bereits den Parameterwert

VerkopenCommArtikel.Parameters.AddWithValue("@RubriekID", intRubriekID) 

Sie eingestellt haben abrufen müssen die SELECT-Abfrage ausführen zuerst, dann den Parameterwert einstellen für die INSERT INTO tblArtikel Abfrage, und führen Sie es dann aus.

+0

Ich habe die Reihenfolge so geändert, und jetzt bekomme ich: Wert kann nicht Null sein 'intGebruikersID = Integer.Parse (GebruikersIDComm.ExecuteScalar)' –

+0

Meine Bestellung der führt, wo falsch, habe ich die Bestellung und die zu beheben Code funktioniert jetzt gut, Danke für Ihre Hilfe! –

+0

Gern geschehen. Bitte denken Sie daran, was ich über das Aktivieren von "Option Strict" gesagt habe. Ich empfehle, dass Sie Ihre Visual Studio-Konfiguration optimieren, um dies als Standard für alle neuen VB.NET-Projekte festzulegen. Es ist wirklich eine gute Idee. –