none
Nach SQLCommand.ExecuteNonQuery oder SQLDataAdapter.Update liefern alle DB Zugriffe keine Results mehr RRS feed

  • Frage

  • MySqlConnection con = DBConnection.DBConnect();
    MySqlCommand com = new MySqlCommand();
    com.CommandType = CommandType.Text;
    com.CommandText = sCmdText;
    com.Parameters.AddRange(parameter);
                                 
    com.Connection = con;
    com.ExecuteNonQuery();
              

    Hallo NG,

    Ich benutze zwar den MySQL Connector aber ich denke die Frage ist übertragbar.

    Mein Problem ist dass nach einem Aufruf von ExecuteNonQuery bzw. Update alle folgenden Lesevorgänge keine Resultate mehr liefern.
    Es treten keine Exceptions auf, es werden einfach keine Resultate (Rows) geliefert.

    Ich habe jetzt ein Close() der Connection ausgeführt und das Pooling über den Connection String deaktiviert.
    Gefallen tut mir das nicht.

    Wo liegt mein Fehler ? Lesend geht es wie gesagt so lange bis der erste Schreibvorgang auf die Datenbank losgelassen wird.

     

    Gruß

    Markus

    Mittwoch, 29. Juni 2011 10:39

Alle Antworten

  • Hallo markus,

     

    grundsätzlich gilt : Nutze MySqlConnection und MySqlCommand mit einem Using.

    Nutze diese Connection bzw Command nur einmal und baue für weitere Aktionen weitere commands bzw. Connections.

    zB

    using (MySqlConnection mysqlConn = new MySqlConnection(ConnectionString))
          {
            mysqlConn.Open();
            var mySqlCommand = new MySqlCommand("select * from skills");
            mySqlCommand.Connection = mysqlConn;
            using (MySqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader())
            {
              while (mySqlDataReader.Read())
              {
                yield return new Skills() { Name = mySqlDataReader.GetString("Name"), ServiceId = mySqlDataReader.GetInt32("Skill_id"), ServiceNummer = mySqlDataReader.GetString("Called_ID") };
              }
            }
    
          }
    

    Bedenke weiterhin : Ein ExecuteNoNQuery liefert dir nur die AffectedRows zurück also eine Zahl , keine Rows selber.

    Dafür nutzt man zB den ExecuteReader auf einen dataReader

    Grüße

     

    Mittwoch, 29. Juni 2011 11:16
  • Danke für die Rückmeldung.

    ExecuteNonQuery nutze ich nur zum schreibenden Zugriff. D.h. an der Stelle lese ich die Daten nicht zurück.

    Die bisherige Lösung war, für jede Abfrage auf die DB ein neues Connection Objekt anzulegen.
    Allerdings wurde die Benutzung des Connection Objekts nicht mit "using" umklammert.

    Bei dieser Lösung ist  das Problem auch aufgetreten. Nur ein "Pooling=FALSE" im Connection String hat das Problem beseitigt.
    D.h. wenn das Connection-Pooling aktiv war, hat er wohl im Hintergrund genau wieder die gleiche Verbindung vom MySQL Connector aufgegriffen und mit dieser war dann auch nach einem Schreibvorgang kein weiterer Zugriff möglich.

    Ich denke die Zerstörung des Connection Objekts nach Verlassen des "using" Bereichs, wird dank aktiviertem Pooling diese Verbindung im MySQL Connector weiterhin bereit halten und diese beim erneuten Zugriff durch ein weiteres neu erzeugtes Connection Objekt wiederverwenden.

    Oder verstehe ich das falsch ?

    Btw was ich oben nicht gesagt habe, DBConnection.DBConnect(); liefert ein globales Connection Objekt zurück, d.h. es wird zur Laufzeit immer nur diese eine Objekt verwendet.

     

    Donnerstag, 30. Juni 2011 07:54
  • Ja,

    eine gleiche Connection wird auch wieder benutzt.

    Hier geht es vielmehr um das SqlCommand Object welches mit Using umklammert werden sollte.

    Warum ist es eigtl. nötig ein globales Objekt zu halten ? Ich persl. finde sowas unschön.

    Beim Repository Pattern zB wird die Verbindung nur bei Bedarf erzeugt (mithilfe von Using)

     

    Also . ich denke nicht das es an der Connection sondern eher ein deinem MySqlCommand Objekt liegt.

    Hier findest du übrigens Bst Practises von Microsoft zu dem thme (unter anderem auch das Thema mit using)

     

    Grüße

     

    Donnerstag, 30. Juni 2011 08:23
  • Danke nochmals.

    Ich werde mir das mal zu Gemüte führen.

    Das "globale" Connection Objekt habe ich mir gehalten, da ich dachte dass das mehr Performance bringt als jedes mal die Connection neu zu erzeugen. Wenn Pooling aktiv ist, ist das natürlich hinfällig.

    Gruß
    Markus

    Donnerstag, 30. Juni 2011 08:30
  • Konnte jetzt das Problem lösen.

    Bevor ich ein Update() auf meinen modifizierten DataTable los lasse, führe ich nun noch ein DataTable.AcceptChanges() aus.
    Die "using" Modifikationen haben hier keine Wirkung gezeigt.

    Bei den Zugriffen per MySQLCommand und ExecuteNonQuery scheint ein using um das MySQLCommand geholfen zu haben.

    Gruß
    Markus

     

    Donnerstag, 30. Juni 2011 12:16
  • Hallo Markus,

    wenn Du ein AcceptChanges ausführst, so kannst Du dir das Update sparen.
    Denn damit werden alle Änderungen übernommen und bei der Datenbank kommt nichts an!

    Da das aber wohl nicht in Deinem Sinne ist, solltest Du die Ursachen ermitteln.

    Welche Version des MySql .NET Connectors verwendest Du?
    Wenn es eine ältere (vor 6.3) ist , so aktualisiere ihn.

    Gruß Elmar

     

     

    Donnerstag, 30. Juni 2011 13:24
    Beantworter
  • Hallo Elmar,

    das ist mir gestern aufgefallen. Hatte mich zunächst nur gefreut, dass nach dem Update der lesende Zugriff funktioniert hatte, dass ich gar nicht gesehen habe dass er meine Änderungen gar nicht geschrieben hatte.

    Habe mir jetzt mal den neuesten Connector.NET installiert, hatte vorher noch einen 5.1.5 installiert. Bisher spielt es.

    Danke nochmal für den Tip.

    Gruß
    Markus

    Freitag, 1. Juli 2011 05:38