2016-09-07 4 views
1

Ich brauche Hilfe beim Einfügen von Daten in mehrere Tabellen. Ich habe 3 Tabellen:Einfügen von Daten in mehrere Tabellen

  • Revizija (rev_id, Broj_rev)
  • Verzija (verz_id, Broj_verz, rev_id)
  • Program (prog_id, Naziv_prog, verz_id)

mit FK Connected - revizija zu verzija, verzija zu programski sustav.

Meine Einfügung schlägt fehl, wenn ich versuche, Programm auszuführen.

SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Database1"].ConnectionString); 
SqlCommand xp = new SqlCommand("Insert into Revizija Values(@Broj_rev)", con); 
xp.Parameters.AddWithValue("@Broj_rev", textBox5.Text); 

con.Open(); 
xp.ExecuteNonQuery(); 
con.Close(); 

SqlCommand xp1 = new SqlCommand("Insert into Verzija values(@Broj)", con); 
xp1.Parameters.AddWithValue("@Broj", textBox4.Text); 

con.Open(); 
xp1.ExecuteNonQuery(); 
con.Close(); 

SqlCommand xp4 = new SqlCommand("Insert into Program values (@Naziv_prog)", con); 
xp4.Parameters.AddWithValue("@Naziv_prog", textBox2.Text); 

con.Open(); 
xp4.ExecuteNonQuery(); 
con.Close(); 
+2

Welchen Fehler erhalten Sie? –

+0

Sind die IDENTITY-Spalten rev_id, verz_id und prog_id? – Steve

Antwort

1

Wenn Sie versuchen, Daten in der Verzija Tabelle einzufügen müssen Sie den Wert auf den Primärschlüssel der Revizija Tabelle zugeordnet kennen und das gleiche passiert, wenn Sie versuchen, mit der Revizija einen Datensatz in der Program Tabelle einfügen .

In diesem Szenario könnten Sie die Fähigkeit von SQL Server verwenden, zwei Befehle zusammen auszuführen und jedem Ihrer ersten beiden Befehle den Befehl sql SELECT SCOPE_IDENTITY() hinzuzufügen. SCOPE_IDENTITY gibt den Wert des letzten IDENTITY-Werts zurück, der über Ihre Verbindung zugewiesen wurde. Das Ergebnis dieses Befehls kann mit ExecuteScalar gelesen und als Eingabeparameter für den folgenden Befehl verwendet werden.

using(SqlConnection con = new SqlConnection(....)) 
using(SqlCommand xp = new SqlCommand(@"Insert into Revizija 
             (Broj_rev) Values(@Broj_rev); 
             SELECT SCOPE_IDENTITY()", con); 
{ 
    con.Open(); 
    xp.Parameters.AddWithValue("@Broj_rev", textBox5.Text); 
    int rev_id Convert.ToInt32(xp.ExecuteScalar()); 

    using(SqlCommand xp1 = new SqlCommand(@"Insert into Verzija 
        (Broj_verz, rev_id) values(@Broj,@rev_id); 
        SELECT SCOPE_IDENTITY()", con); 
    { 
     xp1.Parameters.AddWithValue("@Broj", textBox4.Text); 
     xp1.Parameters.AddWithValue("@rev_id", rev_id); 
     int verz_id = Convert.ToInt32(xp1.ExecuteScalar()); 

     using(SqlCommand xp4 = new SqlCommand(@"Insert into Program 
       (Naziv_prog, verz_id) values (@Naziv_prog, @verz_id)", con); 
     { 
      xp4.Parameters.AddWithValue("@Naziv_prog", textBox2.Text); 
      xp4.Parameters.AddWithValue("@verz_id", verz_id); 
      xp4.ExecuteNonQuery(); 
     } 
    } 
} 

Beachten Sie auch, dass ich den Hauptfehler in Ihren Abfragen behoben habe. Wenn Sie in einer INSERT INTO-Anweisung die Spaltennamen weglassen, müssen Sie Werte für alle vorhandenen Felder angeben (andernfalls kann die Engine die übergebenen Werte nicht korrekt den übereinstimmenden Spalten zuordnen). Aus Gründen der Übersichtlichkeit und um zukünftige Fehler zu vermeiden Geben Sie die Spalten an, die von der Abfrage aktualisiert werden.

+0

Vielen Dank. Ich werde es versuchen. – Tom

+0

Ich bekomme eine unbehandelte Ausnahme vom Typ 'System.NullReferenceException' aufgetreten in WindowsFormsApplication1.exe Fehler in der sqlconnection Linie. – Tom

+0

Nun, ich habe nicht alle _ConfigurationManager.ConnectionStrings ["Database1"] geschrieben. ConnectionString_ aber natürlich sollten Sie das anstelle von ... haben. Und falls Sie es bereits getan haben, dann überprüfen Sie, ob Ihre app.config einen Abschnitt enthält für ConnectionStrings mit einem Eintrag namens Database1 – Steve

Verwandte Themen