2016-07-12 8 views
0

Ich habe ein Formular, um Daten eines Eigentümers und eines Haustieres in eine Datenbank einzugeben. Das Haustier hat einen Fremdschlüssel der Eigentümer-ID, die Daten des Besitzers und des Haustieres sind in der gleichen Form ausgefüllt, also wie setze ich die Besitzer-ID im Haustier-Objekt, wenn die ownerID noch nicht in der Datenbank eingestellt wurde? Oder muss ich erst den Besitzer in der Datenbank einstellen?C# Einstellung Fremdschlüssel

Klasse Owner

private int32 idOwner; 
private String name; 

Klasse Pet Attribute Attribute;

private int32 Pet; 
private int32 idOwner; // foreign key 
private String name; 

Formular

Owner owner = new Owner(); 
owner.Name = this.ownerNameTxt.Text.Trim(); 
OwnerService.addOwner(owner); // add owner to database 

Pet pet = new Pet(); 
pet.name = this.petNameTxt.Text.Trim(); 
pet.idOwner = ???????? 
+0

Was verwenden Sie ADO.NET oder Entity Framework? – Rahul

+0

emmm du hast mich da, ich bin mir nicht sicher, ich nur einen Service-Ordner in der Lösung erstellen und die Verbindungsmethoden ....... Ich benutze System.Data.SqlClient .... Ich weiß nicht, ob das sagen du irgendwas. – DedalusNine

+0

'private Owner _Owner;' Sie sollten dies zu 'Pet' Klasse hinzufügen. Ich denke, das würde helfen. – DhavalR

Antwort

1

So haben Sie eine Identitätsspalte idOwner, die auf dem Einsatz erzeugt wird, und Sie wollen, dass die ID im Pet Objekt einzustellen. Dann müssen Sie Ihre OwnerService.addOwner Methode ändern, um die generierte ID aus der Datenbank auszuwählen und das Eigentümerobjekt zu aktualisieren.

private void addOwner(owner) 
{ 
    // your current logic here but modify to 
    // add ;SELECT SCOPE_IDENTITY(); at the end of your insert query. 
    // and store it in a local int. eg int ownerID = (int)cmd.ExecuteScalar(); 

    owner.idOwner = ownerID; 
} 

Dann Formularcode:

Owner owner = new Owner(); 
owner.Name = this.ownerNameTxt.Text.Trim(); 
OwnerService.addOwner(owner); // add owner to database 

Pet pet = new Pet(); 
pet.name = this.petNameTxt.Text.Trim(); 
pet.idOwner = owner.idOwner; 

Docs für SCOPE_IDENTITY (Transact-SQL):

Gibt den letzten Identitätswert eingefügt in eine Identitätsspalte in den gleichen Umfang. Ein Bereich ist ein Modul: eine gespeicherte Prozedur, Trigger, Funktion oder Batch. Daher befinden sich zwei Anweisungen im gleichen Bereich, wenn sie sich in derselben gespeicherten Prozedur, Funktion oder demselben Stapel befinden.

+0

Gefällt mir? public static void addOwner (Besitzerbesitzer) { Zeichenfolge sql = "INSERT INTO Besitzer (Name)" + "VALUES ('" + Eigentümer.Name + "')"; SELECT SCOPE_IDENTITY (ownerID); \t owner.idOwner = ownerID; verbinden(); SqlCommand cmd = neuer SqlCommand (sql, Verbindung); cmd.ExecuteNonQuery(); trennen(); } – DedalusNine

+0

@DedalusNine Nein, das hat C# Syntaxfehler. Wie folgt: 'String sql =" INSERT INTO Besitzer (Name) "+" VALUES ('"+ Eigentümer.Name +' '); SELECT SCOPE_IDENTITY();"; – user3185569

+0

@DedalusNine dann müssen Sie die ID auf a setzen Variable: 'int ID = (int) cmd.ExecuteScalar();' dann 'owner.idOwner = ID;' Ist das klar? – user3185569

Verwandte Themen