none
Der Update Befehl für eine OLEDB mit dem Text eines Textfeldes RRS feed

  • Frage

  • Ich habe mir eine Mitglieder Liste erstellt und kann die auch in ein DataGridView einlesen. Auch ein Update bekomme ich hin, aber nur mit vorgegebenen Strings. Ich möchte den zu ändernden Wert aber aus einer Textbox holen, da meckert er zwar keinen Fehler an, aber es klappt nicht.

    Hier mal mein Code

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.OleDb;

    namespace DataRW
           
    {
        public partial class frmRW : Form
        {
            private OleDbConnection con;
            private OleDbCommand cmd;
            public String txt;

            public frmRW()
            {
                InitializeComponent();
                
                String connect = "Provider=Microsoft.ACE.OLEDB.12.0;" +
                    "Data Source=RWaktuell.accdb";
                OleDbConnection con = new OleDbConnection(connect);
                con.Open();
                cmd = con.CreateCommand();
                //cmd.CommandText = "Insert into Mitglieder (Vorname)" +
                //    "VALUES('Toni');";
                //cmd.ExecuteNonQuery();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                // TODO: Diese Codezeile lädt Daten in die Tabelle "mitgliederRWDataSet.Mitarbeiter". Sie können sie bei Bedarf verschieben oder entfernen.
                this.mitarbeiterTableAdapter.Fill(this.mitgliederRWDataSet.Mitarbeiter);
            liste_laden();
            }

            private void liste_laden()
            {
                cmd.CommandText = "Select * from Mitglieder;";
                OleDbDataReader reader = cmd.ExecuteReader();
                dataGridRW.Columns.Clear();
                for (int i = 0; i < reader.FieldCount; i++)
                    dataGridRW.Columns.Add(reader.GetName(i),
                         reader.GetName(i));

                while (reader.Read())
                {
                    object[] row = new object[reader.FieldCount];
                    for (int i = 0; i <reader.FieldCount; i++)  
                    row[i] = reader[i];
                    dataGridRW.Rows.Add(row);
                }
                reader.Close();
            //string cmd = "SELECT * FROM Mitglieder"; das geht nicht
            
        }

            private void btnClose_Click(object sender, EventArgs e)
            {
                Close();
            }

            private void btnUpdate_Click(object sender, EventArgs e)
            {
                // DAs mit dem INsert geht
                //cmd.CommandText = "insert into Mitglieder(Vorname)" +
                //    "values( 'Wolle');";
                //cmd.ExecuteNonQuery();
                //** Jetzt mal mit Update
                // DEr geht so nicht  cmd.CommandText = "UPDATE Mitglieder Set Mitglieder.Vorname = 'Wolle';" +
                cmd.CommandType = CommandType.Text;
                txt = txtNeu.Text;
                cmd.CommandText = "UPDATE Mitglieder Set Vorname = '" + txtNeu.Text + "'" +
                    "WHERE Vorname = '" + txtUpdate + "'" + "and Nachname = 'Müller'";
            
                cmd.ExecuteNonQuery();
            }

            private void dataGridRW_CellClick(object sender, DataGridViewCellEventArgs e)
            {

                int row_num = dataGridRW.CurrentCell.RowIndex;
                int col_num = dataGridRW.CurrentCell.ColumnIndex;
                object data = dataGridRW[row_num, col_num];
                //txtUpdate.Text = string.Format("{0}", dataGridRW[row_num, col_num]);

                if (dataGridRW.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null)
                {
                    // der funzt
                   txtUpdate.Text = (dataGridRW.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
                    //anders herum geht das nicht
                    //dataGridRW.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() = txtUpdate.Text;
                    

                }
            }

            private void txtUpdate_TextChanged(object sender, EventArgs e)
            {
            //    // Das klappt nicht
            //    dataGridRW.Rows[5].Cells[1].Value = txtUpdate.Text;
            //    txt = txtUpdate.Text;
            //    //MessageBox.Show(txt);
            }
        }
    }
     

    Was mache ich falsch?

    WolleM43

    Montag, 7. Januar 2019 16:20

Antworten

  • Hi,

    vorab: Du solltest keine Stringverkettungen für das Zusammenstellen von SQL Statements verwenden, sondrn OleDbParameter.

    String sqlStatement = "UPDATE <Tabelle> SET <Spalte1> = @Wert1, <Spalte2> = @Wert2 WHERE <Spalte3> = @Wert3";
    OleDbConnection connection = new OleDbConnection( connectionString );
        connection.Open();
     
    OleDbCommand command = new OleDbCommand( sqlStatement, connection );
        command.Parameters.AddWithValue( "@Wert1", "Wert 1" );
        command.Parameters.AddWithValue( "@Wert2", "Wert 2" );
        ...
     
        command.Dispose();
     
        connection.Close();
        connection.Dispose();

    Wichtig bei den OleDbCommand Parametern ist die Reihenfolge das Hinzufügens. Die muss mit der Reihenfolge der Parameter im SQL Statement (Ausnahmen gibt es bspw. bei Subselects) übereinstimmen.

    Du kannst auch anstelle von ? mit "benannten" Parametern, also bpw @Name, @ID, ... arbeiten. Die Namen sind bei OleDbCommand aber Schall und Rauch, das einzig wichtige ist die Reihenfolge wie oben geschrieben. Für eine bessere Übersicht verwende ich aber in der Regel auch Namen.

    ---

    Dann sollte dein SQL Statement überarbeitet werden. Da fehlen ein paar Leerzeichen. Die wird der Parser zwar wahrscheinlich automatisch ergänzen bzw. das Statement trotzdem verarbeiten können aber besser ist es dennoch.

    ---

    Und falls Du trotzdem mit Stringverkettungen bzw. ohne Parameter arbeiten willst, nimm zumindest eine Variante in dieser Form:

    String sql = $"UPDATE Tabelle SET Spalte = '{Variable}'"

    Achte aber bitte so oder so darauf (aßer bei durchgängiger Verwendung von Parametern, da wird das automatisch erledigt) auch auf SQL Injection. Damit kann dir jemand die gesamte Datenbank schrotten/auslesen/...

    ---

    Zu deiner eigentlichen Frage: Warum dein UPDATE Statement keine Auswirkungen hat, kann ich dir nicht sagen. Wenn kein Fehler bei der Ausführung kommt, wird mit dieser WHERE Klausel wohl kein Datensatz gefunden, der aktualisiert werden würde.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Montag, 7. Januar 2019 16:58
    Moderator