Announcement

Collapse
No announcement yet.

SQLParameters in Update query

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQLParameters in Update query

    Hi,

    folgendes Problem. Ich habe einen Code (folgt unten) in dem ich ein Dataset befülle, dieses Dataset an ein DataGrid hänge und nach einer Änderung das Dataset wieder in die DB zurückschreiben will.

    Dazu bediene ich mich der SQLParameter. Das Update soll später mal über 2 Tabellen gehen, deshalb muss ich mir das UpdateCommand des Adapters selber zusammenstellen.

    Nun mal der Code:
    Code:
    private void tabBenutzerverwaltung_Enter(object sender, EventArgs e)
            {            
                SqlConnection thisConnection = new SqlConnection(Parser._ConnectionString.ConnectionString);
                SqlCommand thisCommand = thisConnection.CreateCommand();
                
                ds = new DataSet();
    
                thisCommand.CommandText = "SELECT * FROM BENUTZER";//, PERSONEN WHERE Benutzer.PersID = Personen.PersID";
                Adapter = new SqlDataAdapter(thisCommand);
    
                //string Update = "UPDATE Benutzer SET Benutzername = 'BADO',AgbBestaetigt = 'True',Gesperrt = 'False',LetzterLogin = '' WHERE BenutzerID = 1";
    
                string Update = "UPDATE Benutzer SET Benutzername = @col1,AgbBestaetigt = @col3,Gesperrt = @col4,LetzterLogin = @col5 WHERE BenutzerID = @col6";
                SqlCommand command = new SqlCommand(Update, thisConnection);
    
                command.Parameters.Add("col1", SqlDbType.VarChar, 510, "Benutzername") ;
                command.Parameters.Add("col3", SqlDbType.Bit, 1, "AgbBestaetigt");
                command.Parameters.Add("col4", SqlDbType.Bit, 1, "Gesperrt");
                command.Parameters.Add("col5", SqlDbType.DateTime, 8, "LetzterLogin");
                command.Parameters.Add("col6", SqlDbType.Int, 4, "BenutzerID");
                command.Parameters[0].SourceVersion = DataRowVersion.Current;
                command.Parameters[1].SourceVersion = DataRowVersion.Current;
                command.Parameters[2].SourceVersion = DataRowVersion.Current;
                command.Parameters[3].SourceVersion = DataRowVersion.Current;
                command.Parameters[4].SourceVersion = DataRowVersion.Original;
    
                
                Adapter.UpdateCommand = command;
                Adapter.Fill(ds,"Result");
    
                dgvUserView.DataSource = ds.Tables["Result"];
                dgvUserView.Columns["BenutzerID"].Visible = false;
                dgvUserView.Columns["PersID"].Visible = false;
                //dgvUserView.Columns["PersID1"].Visible = false;
    
                foreach (DataRow item in ds.Tables[0].Rows)
                {
                    if (item["Kennwort"] != DBNull.Value)
                        item["Kennwort"] = "[HASH]";
                }
    
                dgvUserView.Update();
            }
    
            private void dgvUserView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                //string Update = string.Format("UPDATE Benutzer SET Benutzername = '{0}',AgbBestaetigt = '{1}',Gesperrt = '{2}',LetzterLogin = '{3}' WHERE BenutzerID = {4}",
                //    ds.Tables["Result"].Rows[e.RowIndex]["Benutzername"].ToString(),
                //    ds.Tables["Result"].Rows[e.RowIndex]["AgbBestaetigt"].ToString(),
                //    ds.Tables["Result"].Rows[e.RowIndex]["Gesperrt"].ToString(),
                //    ds.Tables["Result"].Rows[e.RowIndex]["LetzterLogin"].ToString(),
                //    ds.Tables["Result"].Rows[e.RowIndex]["BenutzerID"].ToString());
                //SqlCommand command = new SqlCommand(Update, new SqlConnection(Parser._ConnectionString.ConnectionString));
                //Adapter.UpdateCommand = command;
    
    
                MessageBox.Show(Adapter.Update(ds,"Result").ToString());
    
                foreach (DataColumn item in ds.Tables[0].Columns)
                {
                    Console.WriteLine(ds.Tables[0].Rows[e.RowIndex][item].ToString());
                }
            }

    Was ist nun mein Problem!

    Wenn ich mithilfe der SQLPArameter das Update durchführe geht das das die ersten 3 mal nicht, und nach dem 3ten mal genau so wie es gehen sollte
    (Ja genau .... )

    Wenn ich allerdings den in der Methode dgvUserView_CellValueChanged auskommentierten Code verwende, also die Parameter gegen ein einfaches String.Format ersetzte funktioniert alles einwandfrei .....


    Natürlich könnte ich es so lassen, aber eigentlich wollte ich halt die Parameter verwenden wegen der Prüfung auf den SQLType bzw. auch der sichereren Eingabe der Werte.


    Hat wer eine Idee was ich da falsch mache?


    PS: Sollten noch weitere Daten benötigt werden, einfach fragen


    lg

  • #2
    Fehlt beim Parameternamen bei "Parameters.Add" nicht das @?

    Geht es dir nur darum für die Kennwortspalte entweder Hash oder nix anzuzeigen? Dann sollte sich dein Stalp vermutlich erübrigen wenn du einfach eine berechnete Spalte mit ins SQL aufnimmst und diese an Stelle von Kennwort anzeigst.

    Comment


    • #3
      Hi, und danke für die Antwort.

      Ich habe vergessen das dazuzuschreiben, ich habe es mit und ohne @ versucht.

      Nachdem ich heute den ganzen Vormittag an diesem Problem herumgetüftelt habe, habe ich bereits einige Sachen ausprobiert


      Trotzdem danke

      lg

      Comment


      • #4
        connection.Open() ist wohl nicht notwendig oder?

        Comment


        • #5
          Nein. Der DataAdapter öffnet die Connection beim Fill wenn die noch nicht offen war. Genauso beim Update.

          Comment


          • #6
            genau.

            Meines Wissens öffnet der Adapter die Connection selbstständig. Nur wenn man Sie selber öffnet muss man sich auch um das Schließen der selbigen kümmern.


            lg

            Comment


            • #7
              kommt das Adapter.Fill(ds,"Result"); nicht zu spät, müßte nicht ein weiters Fill() vor den Wertezuweisungen an die Parameter erfolgen?

              Comment


              • #8
                Du läßt dich durch bado's Code verwirren Zwischen UpdateCommando und Fill gibt es keinen Zusammenhang.

                Es zeigt aber das eigentliche Problem warum wir hier kaum helfen können und Bado sich schwer tut den Fehler selbst zu finden. Schlecht isolierter Code mit einem unüblichen Vorgehen.

                Wieso wird der Adapter in der Methode jedesmal neu augebaut. Das ist komplett statischer Code. Also raus aus der Methode an eine Stelle wo der Adapter nur einmal zusammengesetzt wird. Du benutzt ein Dataset brauchst aber nur eine Datatable. Also Dataset weg und Datatable her. Du möchtest die Datatable scheinbar zurück in die Datenbank schreiben wenn die sich ändert hängst dich aber an ein UI Event. Um das von einander zu trennen gehört das eher in das RowChanged Event der Datatable.

                Und daraus schließt dann auch die Frage warum du nicht gleich ein typisiertes Dataset benutzt wenn scheinbar dein Problem statisch(also eindeutige nicht dynamische SQL Statements) ist? Dann bist du auch wieder auf dem üblichen Weg und wir als außenstehende tun uns leichter dir zu helfen.

                Comment


                • #9
                  Hallo,

                  und entschuldigt den langen Delay. Ich danke euch für eure konstruktiven Einwände.

                  @Ralf möchte ich noch sagen das der Code so wie er jetzt ist, keinesfalls dem enstpricht, wie er am Ende aussehen soll. Er hat sich nur durchs Testen und immer wieder abändern sohin entwickelt.
                  Nichtsdestotrotz ist mir unverständlich warum das mit den Parametern nicht funktioniert, Datatable oder Dataset sollte hier eigentlich keine Rolle spielen. (Es handelt sich dabei ja um die UpdateCommand Methode im Adapter.)
                  Auch aus welcher Methode heraus ich mein Update aufrufe sollte eigentlich (die sinnhaftigkeit mal außen vorgelassen) egal sein, und wenn ich es ganz spartanisch an einen Button mit Namen "Aktualisieren" hänge sollte es ja auch gehen

                  Ich werde es jetzt einfach mal ansehen ob ich das was ich will auch mit einem typisierten DataSet erreichen kann (wie vorgeschlagen), und werde es dann so nochmal versuchen.

                  Danke nochmal für eure Hilfe.



                  mit freundlichen Grüßen

                  BaDo

                  Comment


                  • #10
                    Grüße...

                    kann es sein, dass die Editierung deiner Datensätze nicht korrekt beendet sind?
                    Es gibt doch noch das sogenannte EndEdit().

                    Währe vielleicht einen versuch Wert.

                    Gruß Christian!

                    Comment

                    Working...
                    X