2017-06-04 2 views
0

Ich habe eine Zeichenfolge, die 9 Zeichen enthält, zum Beispiel LON052012 (von London 23.05.2012. - Tag.Monat.Jahr.). Ich möchte alle Datensätze aus der Tabelle in Access löschen, wo alle Städte mit den ersten drei Buchstaben aus dieser Zeichenfolge beginnen und diese Monate und das Jahr haben (05.2007.).Löschen bestimmter Datensatz aus der Access-Datenbank auf Knopfdruck

Dies ist die Funktion:

private void button2_Click(object sender, EventArgs e) 
    { 
     if (textBox1.Text != "") 
     { 
      try 
      { 
       string sTown, s1, s2; 
       sTown = textBox1.Text.Substring(0, 3); 
       s1 = textBox1.Text.Substring(3, 2); 
       s2 = textBox1.Text.Substring(5); 

       string sDelete = "DELETE * FROM Country WHERE Town LIKE @p1 and month(TownDate) = @p2 and year(TownDate) = @p3"; 
       OleDbCommand komDelete = new OleDbCommand(sDelete, connection); 
       komDelete.Parameters.AddWithValue("@p1", sTown + "*"); 
       komDelete.Parameters.AddWithValue("@p2", s1); 
       komDelete.Parameters.AddWithValue("@p3", s2); 
       connection.Open(); 
       komDelete.ExecuteNonQuery(); 
       MessageBox.Show("Deleted"); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
      finally 
      { 
       connection.Close(); 
      } 
     } 
     else 
     { 
      MessageBox.Show("TextBox is empty!"); 
     } 
    } 

Dies ist, wie Tabelle Land sieht aus wie (CountryID, Stadt, TownDate):

enter image description here

Er sagt immer, dass der Datensatz selbst gelöscht wird, wenn es ist nicht.

Antwort

0

Bei UPDATE-, INSERT- und DELETE-Anweisungen ist der Rückgabewert von ExecuteNonQuery die Anzahl der vom Befehl betroffenen Zeilen.

Also, Ihren Code zu modifizieren, wie:

var n= komDelete.ExecuteNonQuery(); 
    if (n >0) 
    { 
      MessageBox.Show("Deleted"); 
    } 

bearbeiten

Die Probleme in der Abfrage sind:

  • Die Datenparametertyp s1, s2, die sie Zeichenfolge sind, und sie sollten als Ganzzahl übergeben werden.
  • Mit * und es sollte% sein (Zugang Verwendung %, siehe meinen Kommentar)

so, müssen Sie den Code ändern zu sein:

 var p1 = sTown + "%"; // not * 
     komDelete.Parameters.AddWithValue("@p1", p1); 
     var p2 = int.Parse(s1); //convert to numeric data type 
     var p3 = int.Parse(s2); 
     komDelete.Parameters.AddWithValue("@p2", p2); 
     komDelete.Parameters.AddWithValue("@p3", p3); 


     var n= komDelete.ExecuteNonQuery(); 
    if (n >0) 
    { 
      MessageBox.Show("Deleted"); 
    } 

ich diesen Code mit Zugang getestet 2007 und 2007 Office System Driver: Datenkonnektivität Komponenten und es funktioniert gut und löschte die Zeile.

+0

Ich habe es getan, aber es wird immer noch keine Datensätze aus der Tabelle löschen ... – Nikola

+0

Können Sie überprüfen Sie Ihre SQL-Anweisung nach der Übergabe der Parameter, zB komDelete.CommandText. –

+0

Für OLE-Verbindung mit Zugriff verwenden Sie% anstelle von *, überprüfen https://Stackoverflow.com/a/17000335/3142139 –

0

Try this:

 if (textBox1.Text != "") 
    { 
     //retrieve data 
     string sTown, sMonth, sYear; 
     sTown = textBox1.Text.Substring(0, 3); 
     sMonth = textBox1.Text.Substring(3, 2); 
     sYear = textBox1.Text.Substring(5); 

     //validate input 
     bool valid_town = new Regex(@"[a-z]", RegexOptions.IgnoreCase).IsMatch(sTown) && new Regex(@"[^0-9]").IsMatch(sTown) && sTown.Length ==3; 
     bool valid_month = new Regex(@"[0][1-9]|[1][0-2]").IsMatch(sMonth) && new Regex(@"[^a-z]", RegexOptions.IgnoreCase).IsMatch(sMonth) && sMonth.Length ==2; 

     int year = 0; 
     bool isNum = int.TryParse(sYear,out year); 
     bool valid_year = new Regex(@"[^a-z]", RegexOptions.IgnoreCase).IsMatch(sYear) && sYear.Length == 4 && (isNum ? year > 1980 && year < 2100 : false); 



     string newLine = System.Environment.NewLine; 

     //if input valid 
     if (valid_town && valid_month && valid_year) 
     { 
      //create sql statements 
      string sWhere = String.Format("WHERE Town LIKE {0} and month(TownDate) = {1] and year(TownDate) = {2}", sTown,sMonth,sYear); 
      string sCount = String.Format("SELECT COUNT(*) FROM Country {0}", sWhere); 
      string sDelete = String.Format("DELETE * FROM Country {0}",sWhere); 

      //counts; to be deleted, actually deleted 
      int initialCount = 0; 
      int deletedCount = 0; 

      try 
      { 
       //create connection//NOTE: Using 'Use' statement will handle opening and closing. I dont know where you created your initial 'connection' object but it could cause you problems by haven a connection that is being used in multiple methods. 
       using (OleDbCommand connection = new OleDbCommand(ConnectionString)) 
       { 
        //get total rows to be affected 
        connection.CommandText = sCount; 
        initialCount = connection.ExecuteNonQuery(); 

        //delete rows and get delete count 
        connection.CommandText = sDelete; 
        deletedCount = connection.ExecuteNonQuery(); 
        //display message 
        MessageBox.Show(String.Format("Found {0} rows to delete. {1}Deleted {2} rows.", initialCount, newLine, deletedCount)); 

       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
      finally 
      { 
       connection.Close(); 
      } 
     } 
     { 
      //else; input not valid 
      MessageBox.Show(String.Format("Failed validation of TextBox:{0}Country:{1}{2}Month{3}{4}Year{5}.", newLine, valid_town.ToString(), newLine, valid_month.ToString(), newLine, valid_year.ToString())); ; 

     } 
    } 
    else 
    { 
     MessageBox.Show("TextBox is empty!"); 
    } 

Sie müssen dies hinzufügen mit:

using System.Text.RegularExpressions; 

ich keine Chance bekommen haben Beispielprojekt zu erstellen, es zu versuchen mich ...

Verwandte Themen