none
C# Datensatz lässt sich nicht speichern

    Allgemeine Diskussion

  • Hi NG,

    ich habe bei folgendem Code:

    using System;
    using System.Windows.Forms;
    using System.Data;
    using MySql.Data.MySqlClient;
    
    namespace AdressenDialogTest
    {
        public partial class Bearbeiten : Form
        {
            public Bearbeiten()
            {
                InitializeComponent();
            }
            string uebergabe;
            string user;
            string passwort;
    
            //ID aus Adresstabelle übernehmen
            public String GetAdrID
            {
                set { uebergabe = value; }
            }
    
            //Usernamen holen
            public String GetUser
            {
                set { user = value; }
            }
    
            //Passwort holen
            public String GetPasswort
            {
                set { passwort = value; }
            }
    
            MySqlConnection conn;
            DataTable dt;
            MySqlDataAdapter da;
            MySqlCommandBuilder cb;
            //MySqlCommand cmd;
            BindingSource bs;
    
            private void Bearbeiten_Load(object sender, EventArgs e)
            {
    
                string sql = string.Format("SELECT ID, Anrede, Vorname, Nachname, Strasse, Plz, Ort, EMail, Kommentar FROM mitglied WHERE ID = {0}", Convert.ToInt16(uebergabe));
                string connStr = string.Format("server=127.0.0.1;uid={0};pwd={1};database=adressen", user, passwort);
                conn = new MySqlConnection(connStr);
    
                try
                {
                    
                    
                    da = new MySqlDataAdapter(sql, conn);
                    dt = new DataTable("mitglied");
                    cb = new MySqlCommandBuilder(da);
                    cb.QuotePrefix = "[";
                    cb.QuoteSuffix = "]";
    
                    conn.Open();
                    da.Fill(dt);
                    conn.Close();
    
                    bs = new BindingSource();
    
                    bs.DataSource = dt;
    
                    this.ID.DataBindings.Add("Text", bs, "ID");
                    this.Anrede.DataBindings.Add("Text", bs, "Anrede");
                    this.Vorname.DataBindings.Add("Text", bs, "Vorname");
                    this.Nachname.DataBindings.Add("Text", bs, "Nachname");
                    this.Strasse.DataBindings.Add("Text", bs, "Strasse");
                    this.Plz.DataBindings.Add("Text", bs, "Plz");
                    this.Ort.DataBindings.Add("Text", bs, "Ort");
                    this.EMail.DataBindings.Add("Text", bs, "EMail");
                    this.Kommentar.DataBindings.Add("Text", bs, "Kommentar");
    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    conn.Close();
                }
             
    
            }
            private void btnSpeichern_Click(object sender, EventArgs e)
            {
                try
                {
                    bs.EndEdit();
    
                    //komplette Fehlermeldung:
                    //MySql.Data.MySqlClient.MySqlException wurde nicht behandelt.
      //Message="You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '[mitglied] SET [Kommentar] = 'h' WHERE (([ID] = 1) AND ([Anrede] = '') AND ([Vor' at line 1"
      //Source="System.Data"
      //ErrorCode=-2147467259
      //Number=1064
      //StackTrace:
      //     bei System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
      //     bei System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
      //     bei System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
      //     bei MySql.Data.MySqlClient.MySqlDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
      //     bei System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
      //     bei System.Data.Common.DbDataAdapter.Update(DataTable dataTable)
      //     bei AdressenDialogTest.Bearbeiten.btnSpeichern_Click(Object sender, EventArgs e) in C:\Users\Andy\Documents\Visual Studio 2008\Projects\AdressenDialogTest\AdressenDialogTest\Bearbeiten.cs:Zeile 96.
      //     bei System.Windows.Forms.Control.OnClick(EventArgs e)
      //     bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
      //     bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
      //     bei System.Windows.Forms.Control.WndProc(Message& m)
      //     bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
      //     bei System.Windows.Forms.Button.WndProc(Message& m)
      //     bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      //     bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
      //     bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
      //     bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
      //     bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
      //     bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
      //     bei AdressenDialogTest.Program.Main() in C:\Users\Andy\Documents\Visual Studio 2008\Projects\AdressenDialogTest\AdressenDialogTest\Program.cs:Zeile 18.
      //     bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
      //     bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
      //     bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
      //     bei System.Threading.ThreadHelper.ThreadStart()
      //InnerException: 
    
                    da.Update(dt);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            private void btnSchliessen_Click(object sender, EventArgs e)
            {
                this.Close();
            }
        }
    }

    das Problem, das sich der aktuelle Datensatz nicht speichern lässt (siehe Codeblock).

    Als Datenbankserver benutze ich MariaDB (MySQL).

    Wo liegt mein Problem?

    Gruß

    Andy

    Freitag, 7. Februar 2014 11:49

Alle Antworten

  • Hallo Andy,

    soweit ich das erkennen kann, liegt das eigentliche Problem hier:

                    cb.QuotePrefix = "[";
                    cb.QuoteSuffix = "]";

    Die Quotes in MySQL bestehen nicht aus eckigen Klammern sondern regulär aus einfachen Anführungszeiche:

    cb.QuotePrefix = "'"; cb.QuoteSuffix = "'";

    Ich hoffe, der Tipp hilft :)

    Grüße

    Dominique

    Freitag, 7. Februar 2014 16:22
  • Hi Dominique,

    leider war's das noch nicht. Die Fehlermeldung ist immer noch da.

    Gruß

    Andy

    Samstag, 8. Februar 2014 07:18
  • Hat sich denn etwas an der Fehlermeldung geänder oder makelt er immernoch den selben Teil der Query an?

    Kannst du dir die Abfrage komplett anzeigen lassen und mal posten? Vlt. mittels General Log

    SET GLOBAL general_log = 'ON';

    Auch wenn es vielleicht selbstverständlich ist:
    Das Log danach unbedingt wieder abschalten! ;)

    LG
    Dominique

    Sonntag, 9. Februar 2014 19:34
  • Hi Dominique,

    die Fehlermeldung ist immer noch die Gleiche. Ebenso habe ich es jetzt mit

         
        SET GLOBAL general_log = 'ON';

    versucht. Dies brachte die Fehlermeldungen:

          Fehler    1    Zu viele Zeichen im Zeichenliteral.    C:\Users\Andy\Documents\Visual Studio 2008\Projects\AdressenDialogTest\AdressenDialogTest\Adresstabelle.cs    29    38    AdressenDialogTest
    Fehler    2    Der Typ- oder Namespacename "SET" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)    C:\Users\Andy\Documents\Visual Studio 2008\Projects\AdressenDialogTest\AdressenDialogTest\Adresstabelle.cs    29    13    AdressenDialogTest
    Fehler    3    Der Name "general_log" ist im aktuellen Kontext nicht vorhanden.    C:\Users\Andy\Documents\Visual Studio 2008\Projects\AdressenDialogTest\AdressenDialogTest\Adresstabelle.cs    29    24    AdressenDialogTest
    Fehler    4    ; erwartet.    C:\Users\Andy\Documents\Visual Studio 2008\Projects\AdressenDialogTest\AdressenDialogTest\Adresstabelle.cs    29    24    AdressenDialogTest

    Gruß

    Andy 


    • Bearbeitet AndyAh Montag, 10. Februar 2014 08:57
    Montag, 10. Februar 2014 08:48
  • Oh, das war mein Fehler, verzeih.
    Ich war mir nicht sicher, wie vertraut du mit MySQL bist.

    Also,

      SET GLOBAL general_log = 'ON';

    ist eine reine MySQL-Instruktion, nicht C#.
    Wenn du eine MySQL-Console hast, kannst du sie darüber ausführen. PHPMyAdmin, MySQLWorkbench oder eine Visual Studio Erweiterung tun's natürlich auch.

    Hier mal ein Auszug der MySQL-Doku zum General Log: MySQL Documentation General Query Log

    Das bedeutet in kurz:
    In dem General Log werden ale Queries gelogged, welche der Server verarbeitet. Jenachdem, wieviele das sind, wächst dieses Log innerhalb kurzer Zeit zu einem riesigen Mähdrescher an. Daher mein Hinweis im vorigen Post, das Log nach der Fehlersuche wieder abzuschalten.

    Zurück zum Thema:

    Wenn die Fehlermeldung nach wie vor exakt die selbe ist. Also angibt, es handelt sich um den selben Syntaxfehler, stimmt etwas gewaltig nicht. Ich habe mir den Code jetzt nochmal sehr genau angesehen, auch den StackTrace. Mir ist lediglich aufgefallen, dass du den CommandBuilder ja garnicht verwendest, was meinen ersten Post recht sinnlos macht.
    Ich habe mal nachgelesen und angeblich soll MySQL die Klammern tatsächlich akzeptieren. Sie sind gedacht für den Fall, dass Du Schlüsselwörter in deinen Spaltennamen hast.
    Die MariaDB Doku sagt aber andererseits ganz klar, dass diese nicht verwendet werden, da sie nicht Teil des Standards sind.

    Ich glaube, ich muss ab hier tatsächlich passen. Ich würde Dir empfehlen, mal mit Daten zu spielen und das Ganze etwas genauer zu debuggen, vielleicht findet sich der Fehler. Wäre super, wenn du das dann posten würdest! Viel Glück

    PS:
    Ich habe ein wenig gesucht, hier ein bisschen Rohmaterial:
    http://stackoverflow.com/questions/13518486/update-table-in-database-from-datatable
    Neueste Version 6.8.3 installiert? Es gab diverse kleine Probleme mit dem Update() des Adapters.

    Beste Grüße
    Dominique

    Mittwoch, 12. Februar 2014 22:34
  • *****************************************************************************************************

    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.

    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    *****************************************************************************************************


    Ciprian Bogdan, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Donnerstag, 20. Februar 2014 16:23