2016-05-09 29 views
0

ich ein Projekt mache, und ich bin am Anfang stecken bereits Also habe ich zwei Tische für zwei Klassen wie folgt aus:C# Zwei-Klassen und zwei Tabellen verknüpfen

CREATE TABLE [dbo].[T_Artikli] (
[Id]  INT   IDENTITY (1, 1) NOT NULL, 
[Naziv] NVARCHAR (100) NOT NULL, 
[Sifra] VARCHAR (13) NOT NULL, 
[Vp]  FLOAT (53)  NOT NULL, 
[MP]  FLOAT (53)  NOT NULL, 
[Napomena] NVARCHAR (300) NOT NULL, 
PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

und

CREATE TABLE [dbo].[T_Stanje] (
[Id]  INT   IDENTITY (1, 1) NOT NULL, 
[Trenutno] INT   NOT NULL, 
[Naruceno] INT   NOT NULL, 
[Datum] DATE   NOT NULL, 
[Firma] NVARCHAR (40) NOT NULL, 
PRIMARY KEY CLUSTERED ([Id] ASC), 
CONSTRAINT [FK_T_Stanje_T_Artikli] FOREIGN KEY ([Id]) REFERENCES [dbo].[T_Artikli] ([Id]) 
); 

Die Klasse 'Artikl' und ihr Tisch 'T_Artikli' wirken wie ein Zauber, das Problem ist mit dem anderen. Dieser Teil des Codes sollten Werte speichern in einer Tabelle:

private void btnSacuvaj_Click(object sender, EventArgs e) 
{ 
    CStanje sta = new CStanje(); 
    sta.Trenutno = Int32.Parse(txtTrenutno.Text); 
    sta.Naruceno = Int32.Parse(txtNaruceno.Text); 
    sta.Firma = txtFirma.Text; 
    sta.Datum = DateTime.Parse(dtDatum.Text); 
    Artikl art = new Artikl(); 
    art.ID = Int32.Parse(cbArtikli.SelectedValue.ToString()); 
    sta.Artikl = art; 
    Console.WriteLine(sta.Trenutno); 
    Console.WriteLine(sta.Naruceno); 
    Console.WriteLine(sta.Firma); 
    Console.WriteLine(sta.Datum); 
    Console.WriteLine(art.ID); 
    sta.dodajStanje(); 
    indeksSelektovanog = dgStanje.Rows.Count; 
} 

Es gibt diesen Fehler zurück:

An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll

Additional information: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_T_Stanje_T_Artikli". The conflict occurred in database "C:\USERS\MORSUS\DOCUMENTS\VISUAL STUDIO 2015\PROJECTS\SEMINARSKI\EVIDENCIJA\EVIDENCIJA\BIN\DEBUG\EVIDENCIJADB.MDF", table "dbo.T_Artikli", column 'Id'.

Auf dieser Linie:

public void dodajStanje() 
{ 
    string insertSql = "INSERT INTO T_Stanje " + 
     "(Trenutno, Naruceno, Datum, Firma) VALUES " + 
     "(@Trenutno, @Naruceno, @Datum, @Firma)"; 
    using (SqlConnection connection = new SqlConnection(_connectionString)) 
    { 
     SqlCommand command = connection.CreateCommand(); 
     command.CommandText = insertSql; 
     //command.Parameters.Add(new SqlParameter("@Sifra", Sifra)); 
     command.Parameters.Add(new SqlParameter("@Trenutno", Trenutno)); 
     command.Parameters.Add(new SqlParameter("@Naruceno", Naruceno)); 
     command.Parameters.Add(new SqlParameter("@Datum", Datum)); 
     command.Parameters.Add(new SqlParameter("@Firma", Firma)); 
     connection.Open(); 
     command.ExecuteNonQuery(); //error 
    } 
} 

Ich nehme ich etwas falsch gemacht habe in der SQL . Kann mir bitte jemand aufzeigen?

Eine weitere Frage zu SQL, wie kommt es, dass meine SQL-Tabellen nur für einige Zeit gespeichert werden, zB 3-4 Programmläufe. Die Daten werden nach einiger Zeit gelöscht. Sie wissen nicht genau wann. Und Kopieren nach Ausgabeverzeichnis ist auf Neu kopieren gesetzt.

Fragen Sie nach weiteren Informationen.

Antwort

3

Ja, diese Einschränkung ist unten falsch; Sie haben den Primärschlüssel der Tabelle T_Stanji sowohl als Primärschlüssel als auch als Fremdschlüssel für die Tabelle T_Artikli, was nicht möglich ist. Beachten Sie beide Verwendungen derselben Spalten-ID.

CONSTRAINT [FK_T_Stanje_T_Artikli] FOREIGN KEY ([Id]) REFERENCES [dbo].[T_Artikli] ([Id]) 

Sie benötigen einen ArtikliID zum T_Stanje Tabelle hinzuzufügen:

[ArtikliID] INT (NULL | NOT NULL) 

Und dann diese Einschränkung zu ändern:

CONSTRAINT [FK_T_Stanje_T_Artikli] FOREIGN KEY ([ArtikliID]) REFERENCES [dbo].[T_Artikli] ([Id]) 

Damit der Fremdschlüssel dieser neuen Spalte kartiert.

+0

Also ist das Problem in den gleichen Attributnamen? – Morsus

+1

Um nur pedantisch zu sein, ist es auch in 1: 1-Beziehungen gültig, wenn die PK auch eine FK ist; Es ist, dass beide IDENTITÄT das Problem sind. Nur der "Elternteil" sollte IDENTITY verwenden. – Uueerdo

+0

Ja wahr @Uueerdo, guter Punkt. Ich dachte, basierend auf der Beschreibung würde es wahrscheinlich nicht der Fall sein, aber ja möglich. –

Verwandte Themen