2016-12-27 4 views
0

Ich versuche, meine Datenbank zu aktualisieren, indem Sie einen bestimmten Datensatz aus der Datenbank auswählen und in den Textfeldern anzeigen und dann auf eine Schaltfläche klicken, um die Bearbeitung über die Textfeldeingabe zu aktualisieren . Wenn ich jedoch versuche, zu überprüfen, ob der Datensatz in der Datenbank vorhanden ist, indem ich die Anzahl der betroffenen Zeilen ermitteln kann, wird immer 0 angezeigt. Kann mir jemand helfen, herauszufinden, warum das so ist?So aktualisieren Sie die Access-Datenbank von Textboxeingabe in C#

private void button3_Click(object sender, EventArgs e) 
     { 

      string ghost1 = textBox1.Text.ToString(); 
      string ghost2 = textBox2.Text.ToString(); 
      string ghost3 = textBox3.Text.ToString(); 
      string ghost4 = textBox4.Text.ToString(); 

      OleDbConnection conn = new OleDbConnection(); 
      conn.ConnectionString = @"Provider=Microsoft.JET.OLEDB.4.0;Data Source=C:\Users\jameschoi\Desktop\andrew.mdb"; 
      conn.Open(); 
      //OleDbDataReader myReader = null; 
      OleDbCommand command = new OleDbCommand("SELECT * FROM Stock WHERE SKU ='" + ghost1 + "'", conn); 
      OleDbCommand combank = new OleDbCommand("INSERT INTO Stock (Description, Qty, Price) VALUES ('" + ghost2 + "', '" + ghost3 + "', '" + ghost4 + "')", conn); 

      int frango = command.ExecuteNonQuery(); 
      string test1 = frango.ToString(); 

      command.ExecuteNonQuery(); 

      try 
      { 
       if (frango > 0) 
       { 
        combank.ExecuteNonQuery(); 
        MessageBox.Show("Update Successful"); 
        conn.Close(); 
       } 
       else 
       { 
        MessageBox.Show("Record does not exist"); 
       } 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show("Failed due to" + ex.Message); 
      } 

      finally 
      { 
       conn.Close(); 
       DataSet_update(); 
      } 

     } 
+0

nur um sicher zu sein, was 'SELECT * FROM Lager WHERE SKU = '" + ghost1 + "'' sah aus wie vor dem Aufruf 'ExecuteNonQuery()'? Ein einfacher Whitespace kann alles ruinieren. –

+2

Verwenden Sie immer SQL-Parameter, anstatt Ihre SQL zusammen zu kleben. Unter anderem überliefern Sie, wie ich annehme, Zahlen (Menge, Preis) als Text. Außerdem ist die Text-Eigenschaft 'string', um mit zu beginnen -' ToString() 'ist sinnlos – Plutonix

+0

@BagusTesa Ich verstehe nicht, was du meinst? Wenn du die Leerzeichen zwischen dem '+ ghost1 +' meinst, habe ich '+ ghost1 +' versucht und frugo kommt immer noch auf 0. – Icecubelegacy

Antwort

0

Ich finde es einfacher wie

OleDbCommand command = new OleDbCommand("SELECT COUNT(*) FROM Stock WHERE SKU ='" + ghost1 + "'", conn); 
int rowCount = (int) command.ExecuteScalar(); 
if(rowCount > 0) 
{ 
    OleDbCommand combank = new OleDbCommand("INSERT INTO Stock (Description, Qty, Price) VALUES ('" + ghost2 + "', '" + ghost3 + "', '" + ghost4 + "')", conn); 
    combank.ExecuteNonQuery(); 
    MessageBox.Show("Update Successful"); 
} 

Aber dieser Code wird nicht empfohlen, da es zu SQL Injection anfällig ist. Sie sollten Using und Parameterized Queries wie diese

using (OleDbConnection conn = new OleDbConnection(/* connection info */)) 
{ 
    sqlq = "SELECT COUNT(*) FROM Stock WHERE SKU = ?" 
    conn.Open(); 
    using (OleDbCommand comm1 = new OleDbCommand(sqlq, conn)) 
    { 
     OleDbParameter ghost1Param = new OleDbParameter(); 
     comm1.Parameters.Add(ghost1Param).Value = ghost1; 
     int rowCount = (int) comm1.ExecuteScalar(); 
     if(rowCount > 0) 
     { 
      sqlaq = "INSERT INTO Stock (Description, Qty, Price) VALUES (?, ?, ?)" 
      using (OleDbCommand combank = new OleDbCommand(sqlaq, conn)) 
      { 
       combank.Parameters.Add(ghost2Param).Value = ghost2; 
       combank.Parameters.Add(ghost3Param).Value = ghost3; 
       combank.Parameters.Add(ghost4Param).Value = ghost4; 
       combank.ExecuteNonQuery(); 
       //Update signifies Alteration to exsisting record. 
       MessageBox.Show("Insert was Successful"); //Try to use relevant messages 
      } 
     } 
    } 
} 

OleDbCommand verwenden und OdbCommand nicht unterstützt benannte Parameter und verwendet das? Platzhalter stattdessen, so ist die Reihenfolge der Parameter wichtig. Sie können seinen Parametern jedoch Namen geben, anstatt sie aus Gründen der Lesbarkeit zu verwenden.

Sie sollten "verwenden" verwenden, wenn Sie sicher sein wollen, dass ein Objekt, das Ressourcen zuweist, bereinigt wird. Denn wenn Sie ein Schlüsselwort in der Umgebung verwenden, in der Sie ein neues Objekt erstellen, wird sichergestellt, dass Dispose für Sie aufgerufen wird. Es garantiert, dass Dispose aufgerufen wird, was auch immer passiert ... auch wenn eine Ausnahme im Rumpf der using-Anweisung ausgelöst wird.

+0

Ich habe gerade meinen Code geändert, damit er zu den Parametern passt und 'using' Anweisungen, jedoch gibt es einen Fehler, der besagt, dass" Index oder Primärschlüssel keinen Nullwert enthalten kann "in' combank.ExecuteNonQuery(); ' – Icecubelegacy

+0

Okay, das Problem ist jetzt gelöst. Ich habe gerade den Befehl combank von 'INSERT INTO' nach' UPDATE Stock SET etc etc' geändert und es funktioniert jetzt. Danke für deine Hilfe!! – Icecubelegacy

Verwandte Themen