Frage Verwenden von ExecuteReader anstelle von ExecuteNonQuery


MySqlCommand cmd = new MySqlCommand
                    (@"INSERT INTO Table(field) VALUES('somevalue');" +
                    "SELECT * FROM table",cn);

Dies funktioniert gut für mich, da ich diese Anweisungen nur an meinen MySQL-Server übergebe.

Ist es in Ordnung zu verwenden ExecuteReader() beim Einfügen & Aktualisieren & Löschen?

Ich benutze normalerweise ExecuteNonQuery() auf diesen.


5
2017-08-31 02:13


Ursprung


Antworten:


Sie können die zusätzliche INSERT-Funktion zusammen mit SELECT mit ExecuteReader () bündeln. Das ist in Ordnung.

Ich sehe zwei Dinge, die möglicherweise nicht in Ordnung sind ... nichts im Code selbst, aber was Sie gezeigt haben, ist vereinfacht, und der vereinfachte Code weist auf einige potentielle schlechte Praktiken hin:

Der erste ist nicht in Ordnung, dass dein Code so aussieht Macht Verwenden Sie die Verkettung von Zeichenfolgen, um Werte in Ihre Abfrage zu übernehmen. Etwas wie das:

MySqlCommand cmd = new MySqlCommand
                (@"INSERT INTO Table(field) VALUES('" + somevariable + "');" +
                "SELECT * FROM table",cn);

Das ist ein enorm Problem, da es eine klaffende Sicherheitslücke in Ihrer Anwendung öffnet. Stattdessen müssen Sie Abfrageparameter verwenden, sodass der Code mehr wie folgt aussieht:

MySqlCommand cmd = new MySqlCommand
                (@"INSERT INTO Table(field) VALUES(@somevalue);" +
                "SELECT * FROM table",cn);
cmd.Parameters.Add("@somevalue", SqlDbType.VarChar, 50).Value = somevariable;

Das andere potentielle Problem besteht darin, dass Ihr Befehl und, noch wichtiger, Ihre Verbindung, in einen try / finally-Block (oder vorzugsweise einen using-Block) wie folgt eingeschlossen werden sollte:

using (var cn = new MySqlConnection("..."))
using (var cmd = new MySqlCommand("@INSERT INTO Table(field).... ", cn))
{
    cmd.Parameters.Add(...);
    cn.Open();
    using (var rdr = cmd.ExecuteReader())
    {
        while (rdr.Read())
        {
            //...
        }
    }
}

8
2017-08-31 02:30



ExecuteReader

Nicht verwenden: wenn die Datenbankabfrage genau 1 liefert   Aufzeichnung.

Verwendung: Wenn die Datenbankabfrage eine Gruppe von Datensätzen bereitstellen soll. Es kann   Suche oder Bericht sein.

ExecuteNonQuery

Verwendung: Wenn wir über einen einzigen Datenbankeintrag sprechen - in Update,   Einfügen, Löschen und Abrufen nach Id.

ExecuteScalar

Nicht verwenden: Wenn die Datenbankabfrage einen einzelnen Wert und diesen Wert zurückgibt   kann als Parameter in T-SQL definiert werden. ExecuteNonQuery mit Ausgabe   Parameter sind in diesem Fall immer bevorzugt, da es mehr ist   flexibel, morgen wird es also 2 Werte geben   ExecuteNonQuery müssen wir Methodensignaturen nicht ändern.

Verwendung: Wenn die Datenbankabfrage einen einzelnen Wert zurückgibt und dieser Wert nicht   als Ausgabeparameter definiert sein, wegen T-SQL-Typ Einschränkung für   Variablen.

Referenz 


4
2017-08-31 02:15



Wenn Sie aus Gründen der Strukturierung verwenden müssen ExecuteReader dann gehen Sie voran, denken Sie daran, den Leser danach zu entsorgen. Es hat eine kleine Auswirkung auf das Programm, aber es ist höchstwahrscheinlich auf den .NET-Teil beschränkt, meistens nur auf den Speicherverbrauch einer zusätzlichen Klasseninstanz. Tatsächlich verwenden bestimmte ADO.Net-Anbieter ExecuteReader hinter ExecuteNonQuery im Inneren.

Das größere Problem hier ist die SELECT * FROM table Teil nach Ihrer einfügen Abfrage. Auch wenn Sie den Reader nicht zum Lesen der Daten verwenden, verbraucht er dennoch mehr Ressourcen, um eine ausgewählte Abfrage auszuführen. Hier sollte es auf der MySQL-Seite keinen Unterschied geben, ob Sie verwenden ExecuteReader oder ExecuteNonQuery (es sei denn, du liest natürlich aus dem Reader)


1
2017-08-31 02:30