2016-09-24 2 views
0

Ich habe Probleme bekommen, meine Beilage zur Arbeit zu bringen. Ich habe darüber nachgedacht, basierend auf dem ausgewählten Index von zwei Comboboxen (1. cboCustomer 2. cboProduct) und einer Textbox (RegistrationDate). Der Fehler, den ich am meisten bekomme, würde damit zusammenhängen, dass die CustomerID Null ist; von dem ich dachte, dass es automatisch generiert werden sollte. Was mich am meisten verwirrt, sind natürlich die Formularspezifikationen. Die cboCustomer-Combobox muss den Namen des Kunden anzeigen. welches nicht Teil der Registrierungstabelle ist. Und die cboProduct Combobox muss den Produktnamen anzeigen; Das bezieht sich auch nicht auf die Registrierungstabelle. In der Registrierungstabelle muss ich die Einfügung vornehmen, aber die Combobox wird mit zwei Methoden geladen, die den Namen aus den Tabellen Customer und Product abrufen, die nicht für die Einfügung verwendet werden können. Wenn ich versuche, nur das Registrierungsdatum einzufügen, bekomme ich eine Fehlermeldung, dass ProductCode nicht Null sein kann. Ich bin auch ein wenig verwirrt, wenn die AddRegistration-Methode die Einfügung ausführen wird, obwohl ein boolescher Wert zurückgegeben wird. Danke für jede Hilfe und für Ihre Zeit.C# -Ausgabe beim Versuch, in die Datenbankdatei einzufügen

Die meisten der folgenden Code wurde ein paar Mal geändert, weil ich mehrere Lösungen ohne Erfolg versucht habe.

Dies ist der Code, in dem ich die Werte abrufen muss, die an die AddRegistration-Methode übergeben werden sollen.

public void PutRegistrationData(Registration registration) 
    { 
     registration.RegistrationDate = registrationDateTextBox.Text; 
     registration.ProductCode = productComboBox.SelectedValue.ToString(); 
    } 

Dies ist der Code für die Schaltfläche auf dem Formular, das den Einsatz in der AddRegistration auslöst.

private void btnRegister_Click(object sender, EventArgs e) 
    { 
     if (this.IsPresent(registrationDateTextBox.Text)) 
     { 
      registration = new Registration(); 
      this.PutRegistrationData(registration); 
      try 
      { 
       RegistrationDB.AddRegistration(registration); 
       MessageBox.Show("The product was entered successfully", "Registration Success"); 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message, ex.GetType().ToString()); 
      } 
     } 
    } 

Dies ist der Code, den ich für meine einfügen in AddRegistration der RegistrationDB-Klasse habe.

public static bool AddRegistration(Registration registration) 
    { 
     try 
     { 
      SqlConnection connection = TechSupportDB.GetConnection(); 
      string insertStatement = "INSERT INTO Registrations (ProductCode, RegistrationDate" + 
            "VALUES (@ProductCode,@RegistrationDate)"; 
      SqlCommand insertCommand = new SqlCommand(insertStatement, connection); 
      //insertCommand.Parameters.AddWithValue("@CustomerID", registration.CustomerID); 
      insertCommand.Parameters.AddWithValue("@ProductCode", registration.ProductCode); 
      insertCommand.Parameters.AddWithValue("@RegistrationDate", registration.RegistrationDate); 
      insertCommand.Connection = connection; 

      connection.Open(); 
      insertCommand.ExecuteNonQuery(); 
      connection.Close(); 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 
} 

}

+0

Der INSERT-Befehl fehlt die close Parenthesys nach der Feldliste. Ist es ein Tippfehler? – Steve

+0

Entfernen Sie auch den leeren Catch in der AddRegistration, weil Sie auf diese Weise die echte Ausnahme verlieren, die Ihnen sagt, was mit Ihrer Anfrage falsch ist – Steve

+0

Danke für die Antwort. Und es könnte ein Tippfehler sein, ich habe mehrere Stunden mit diesem Code verbracht und den Einschub ein paar Mal geändert. – JaceLandrum

Antwort

0

Nach Ihre Kommentare über Sie auch den CustomerID Wert aus Kunden Combo lesen müssen, fügen Sie sie Registration Instanz und die Abfrage auch

public void PutRegistrationData(Registration registration) 
{ 
    registration.RegistrationDate = registrationDateTextBox.Text; 
    registration.ProductCode = productComboBox.SelectedValue.ToString(); 
    registration.CustomerID = customerComboBox.SelectedValue.ToString(); 
} 


public static bool AddRegistration(Registration registration) 
{ 
    string insertStatement = @"INSERT INTO Registrations 
      (ProductCode, RegistrationDate, CustomerID) 
      VALUES (@ProductCode,@RegistrationDate, @CustomerID)"; 
    using(SqlConnection connection = TechSupportDB.GetConnection()) 
    using(SqlCommand insertCommand = new SqlCommand(insertStatement, connection)) 
    {  
     insertCommand.Parameters.AddWithValue("@CustomerID", registration.CustomerID); 
     insertCommand.Parameters.AddWithValue("@ProductCode", registration.ProductCode); 
     insertCommand.Parameters.AddWithValue("@RegistrationDate", registration.RegistrationDate); 

     connection.Open(); 
     int added = insertCommand.ExecuteNonQuery(); 
     return added != 0; 
    } 
} 
dieser Wert einzufügen ändern

Beachten Sie, dass ich Ihre SqlConnection und SqlCommand in einen using-Block gesetzt habe, um sicherzustellen, dass diese beiden Objektinstanzen korrekt geschlossen und entsorgt werden. Wenn eine Klasse die IDisposable-Schnittstelle implementiert, ist es besser, das Objekt so schnell wie möglich zu entfernen, und die using statement ermöglicht genau dies. Um einen booleschen Wert zurückzugeben, wenn der Datensatz hinzugefügt wurde, habe ich die return-Anweisung der AddRegistration nur dann auf true gesetzt, wenn das Einfügen erfolgreich ist und überprüft, ob die Rückgabe von ExecuteNonQUery nicht null ist.

In allen anderen Fällen, die Ausnahme erreichen die obere Ebene der Anwendung, wo Sie es für Ihren Benutzer behandeln können.

Ich möchte auch unterstreichen, dass AddWithValue is a dangerous method und sollte mit äußerster Sorgfalt (oder besser gar nicht) verwendet werden. Es macht eine Menge Annahmen über Ihre Parameter. Zum Beispiel wird das Datum hier als String übergeben. Sie können nur hoffen, dass das Datenbankmodul die Zeichenfolge zurück in ein Datum übersetzen kann, wenn die Spalte ein Datum erwartet.

+0

Ich habe die Änderungen übernommen, die Sie vorgeschlagen haben, aber ich bekomme eine weitere Ausnahme; Die INSERT-Anweisung steht im Konflikt mit der FOREIGN KEY-Einschränkung. Tabelle Kunden, Spalte Kunden-ID. Die Anweisung wurde beendet. – JaceLandrum

+0

Diese Frage erläutert Ihr Problem: http://stackoverflow.com/questions/2965837/insert-statement-conflicted-with-the-foreign-key-constraint Wie schaffen Sie es, einen Kunden in das Kombinationsfeld Kunde einzufügen sein Tisch? – Steve

+0

Die Information war nützlich, danke für den Link. Ich muss jedoch darüber nachdenken, wie ich dieses Problem lösen kann. Ich habe eine zweite INSERT berücksichtigt, die eine Einfügung der customerID in die Customers-Tabelle anwendet, aber es scheint keine funktionierende Lösung atm zu sein. Ich werde weiterhin versuchen, dieses Problem zu beheben.Ich bemerkte auch, dass der Beitrag erwähnt "Einfügen von schlechten Daten", die ich sagen kann, ist möglich. Ich habe einen Blick auf die laufenden Werte während einer Anwendung ausgeführt, und der angegebene Wert war 0 für customerID, – JaceLandrum

Verwandte Themen