2016-07-22 113 views
0

Ich habe eine INSERT-Anweisung eingerichtet, um Werte an die Datenbank zurückzugeben, wenn das Textfeld leer ist, aber immer noch nicht auf der Einfügung.Zurückgeben von Nullwerten für den Zugriff auf die Datenbank über OleDb

Ich habe festgestellt 'Kein Wert für einen oder mehrere Parameter angegeben.'

wohin gehe ich falsch?

meine Felder Zugang sind nicht gesetzt

erforderlich
private void NewCustomer_Load(object sender, EventArgs e) 
{ 

} 

private void button2_Click(object sender, EventArgs e) 
{ 
    OleDbConnection Conn = new OleDbConnection(); 
    Conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BoilerSvc_be.mdb"; 
    OleDbCommand command = new OleDbCommand(); 
    command.CommandText = "INSERT INTO Contacts (Title,Initial,Surname,[Address 1],[Address 2],[Address 3],[Post Town],[Post Code],Telephone,Archived) VALUES (@Title,@FirstName,@LastName,@Address1,@Address2,@Address3,@PostTown,@PostCode,@Telephone,Archived = 0)"; 

    if (string.IsNullOrEmpty(FirstName.Text)) 
    { 
     command.Parameters.AddWithValue("@FirstName", DBNull.Value); 
    } 
    else 
    { 
     command.Parameters.AddWithValue("@FirstName", title.Text); 
    } 

    if (string.IsNullOrEmpty(LastName.Text)) 
    { 
     command.Parameters.AddWithValue("@LastName", DBNull.Value); 
    } 
    else 
    { 
     command.Parameters.AddWithValue("@LastName", title.Text); 
    } 

    if (string.IsNullOrEmpty(Address1.Text)) 
    { 
     command.Parameters.AddWithValue("@Address1", DBNull.Value); 
    } 
    else 
    { 
     command.Parameters.AddWithValue("@Address1", title.Text); 
    } 

    if (string.IsNullOrEmpty(Address2.Text)) 
    { 
     command.Parameters.AddWithValue("@Address2", DBNull.Value); 
    } 
    else 
    { 
     command.Parameters.AddWithValue("@Address2", title.Text); 
    } 

    if (string.IsNullOrEmpty(Address3.Text)) 
    { 
     command.Parameters.AddWithValue("@Address3", DBNull.Value); 
    } 
    else 
    { 
     command.Parameters.AddWithValue("@Address3", title.Text); 
    } 

    if (string.IsNullOrEmpty(Postcode.Text)) 
    { 
     command.Parameters.AddWithValue("@PostCode", DBNull.Value); 
    } 
    else 
    { 
     command.Parameters.AddWithValue("@PostCode", title.Text); 
    } 

    if (string.IsNullOrEmpty(TownCity.Text)) 
    { 
     command.Parameters.AddWithValue("@PostTown", DBNull.Value); 
    } 
    else 
    { 
     command.Parameters.AddWithValue("@PostTown", title.Text); 
    } 

    if (string.IsNullOrEmpty(PhnNum.Text)) 
    { 
     command.Parameters.AddWithValue("@Telephone", DBNull.Value); 
    } 
    else 
    { 
     command.Parameters.AddWithValue("@Telephone", title.Text); 
    } 

    if (string.IsNullOrEmpty(Titl.Text)) 
    { 
     command.Parameters.AddWithValue("@Title", DBNull.Value); 
    } 
    else 
    { 
     command.Parameters.AddWithValue("@Title", title.Text); 
    } 

    Conn.Open(); 
    command.Connection = Conn; 
    command.ExecuteNonQuery(); 
    Conn.Close(); 

    FirstName.Text = null; 
    LastName.Text = null; 
    Address1.Text = null; 
    Address2.Text = null; 
    Address2.Text = null; 
    Postcode.Text = null; 
    TownCity.Text = null; 
    Titl.Text = null; 
    PhnNum.Text = null; 
    Address3.Text = null; 

    MessageBox.Show("Customer Added"); 
} 
+0

Ich denke, sollten Sie die „archivierten = 0“ am Ende entfernen. Und setzen Sie einfach 0. – Danieboy

+0

Abgesehen von allem anderen, ich denke nicht, OleDbCommand unterstützt benannte Parameter überhaupt: "Der OLE DB .NET Provider unterstützt keine benannten Parameter für die Übergabe von Parametern an eine SQL-Anweisung oder eine gespeicherte Prozedur von ein OleDbCommand, wenn CommandType auf Text festgelegt ist. In diesem Fall muss der Platzhalter Fragezeichen (?) verwendet werden. " –

+0

1. Sie haben 'title.Text' überall auf Ihrem' AddWithValue', wo Sie den spezifischen Text für dieses Element hinzufügen möchten. 2. 'Archived = 0 'funktioniert nicht, weil Sie den Wert von' Archived' zum Zeitpunkt des Einfügens nicht kennen, Sie müssen einen Wert angeben (dies ist der Hauptschuldige). 3. Umwickeln Sie Ihr Connection-Objekt in einer 'using'-Anweisung, so dass es immer geschlossen ist. 4. Gute Arbeit an Parametern, aber bitte vergessen Sie nicht, den Parametertyp anzugeben, Sie können dies auf 'AddWithValue' verketten. Schließlich sind die Parameter positionsbasiert für OleDb, daher sollte die Reihenfolge der Parameter in der Abfrage genau mit den Parametern in der Sammlung übereinstimmen. – Igor

Antwort

0

Basierend auf den Kommentaren Ich bin mir nicht sicher, ob dies mit einer OleDb-Verbindung funktioniert, aber Sie sollten Ihren Code wie folgt unter der Annahme, umschreiben es akzeptieren würde, die genannten Parameter.

private void button2_Click(object sender, EventArgs e) 
{ 
    using(OleDbConnection Conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BoilerSvc_be.mdb")) 
    { 
     OleDbCommand command = new OleDbCommand(); 

     command.CommandText = "INSERT INTO Contacts (Title,Initial,Surname,[Address 1],[Address 2],[Address 3],[Post Town],[Post Code],Telephone,Archived) VALUES (@Title,@FirstName,@LastName,@Address1,@Address2,@Address3,@PostTown,@PostCode,@Telephone,0)"; 

     command.Parameters.AddWithValue("@FirstName", string.IsNullOrEmpty(FirstName.Text) ? DBNull.Value : title.Text); 
     command.Parameters.AddWithValue("@LastName", string.IsNullOrEmpty(LastName.Text) ? DBNull.Value : title.Text); 
     command.Parameters.AddWithValue("@Address1", string.IsNullOrEmpty(Address1.Text) ? DBNull.Value : title.Text); 
     command.Parameters.AddWithValue("@Address2", string.IsNullOrEmpty(Address2.Text) ? DBNull.Value : title.Text); 
     command.Parameters.AddWithValue("@Address3", string.IsNullOrEmpty(Address3.Text) ? DBNull.Value : title.Text); 
     command.Parameters.AddWithValue("@PostCode", string.IsNullOrEmpty(Postcode.Text) ? DBNull.Value : title.Text); 
     command.Parameters.AddWithValue("@PostTown", string.IsNullOrEmpty(TownCity.Text) ? DBNull.Value : title.Text); 
     command.Parameters.AddWithValue("@Telephone", string.IsNullOrEmpty(PhnNum.Text) ? DBNull.Value : title.Text); 
     command.Parameters.AddWithValue("@Title", string.IsNullOrEmpty(Titl.Text) ? DBNull.Value : title.Text); 

     Conn.Open(); 
     command.Connection = Conn; 
     command.ExecuteNonQuery(); 
    } 

    FirstName.Text = null; 
    LastName.Text = null; 
    Address1.Text = null; 
    Address2.Text = null; 
    Address2.Text = null; 
    Postcode.Text = null; 
    TownCity.Text = null; 
    Title.Text = null; 
    PhnNum.Text = null; 
    Address3.Text = null; 

    MessageBox.Show("Customer Added"); 
} 
+0

I made 1 ändern, habe ich einen "using" -Block um die Verbindung hinzugefügt, der immer gemacht werden sollte, damit die Verbindung im Falle einer Ausnahme nicht offen bleibt. – Igor

+0

Danke @Igor – Danieboy

0

Wie bereits erwähnt, für OleDb Parameter Sie haben Fragen zu verwenden markiert statt:

private void button2_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     using (var Conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BoilerSvc_be.mdb")) 
     { 
      var command = new OleDbCommand("INSERT INTO Contacts (" + 
           "Title, Initial, Surname,[Address 1],[Address 2],[Address 3],[Post Town],[Post Code],Telephone,Archived)" + 
         " VALUES ( ?,   ?,  ?,   ?,   ?,   ?,   ?,   ?,  ?,  0)", Conn); 
      Control[] controls = { Titl, FirstName, LastName, Address1, Address2, Address3, TownCity, Postcode, PhnNum }; 

      foreach (var control in controls) 
       command.Parameters.AddWithValue("@" + control.Name, 
        string.IsNullOrEmpty(control.Text) ? DBNull.Value : control.Text as object); 

      Conn.Open(); 
      if (command.ExecuteNonQuery() == 1) 
      { 
       MessageBox.Show("Customer Added"); 
       foreach (var control in controls) 
        control.Text = ""; 
      } 
      else 
       MessageBox.Show("Customer was not Added"); 

     } // Conn is closed and disposed at the end of the using block 
    } 
    catch (Exception ex) { 
     MessageBox.Show("Exception : " + ex.Message); 
    } 
}