Ausführungsoptimierung und Parameterübergabe

1. Prüfung des SqlConnection‑Verbindungsstatus

Eigenschaft: conn.State

Enumerationstyp ConnectionState

// Verbindung öffnen, falls sie nicht bereits offen ist
if (conn.State != ConnectionState.Open)
{
    conn.Open();
}Code-Sprache: JavaScript (javascript)

Hinweis: Bei Verwendung mit using wechselt der Status nach der Freigabe automatisch auf Closed.
Häufige Zustände: Open / Closed / Connecting u. a.

2. Wichtige Null‑Prüfung bei ExecuteScalar

Prüfen Sie den Rückgabewert von ExecuteScalar, um Fehler durch Null‑Werte zu vermeiden

object obj = sqlCom.ExecuteScalar();

// Sowohl null als auch DBNull.Value müssen geprüft werden
if (obj == null || obj == System.DBNull.Value)
{
    MessageBox.Show("Ergebnis ist null");
}
else
{
    MessageBox.Show(obj.ToString());
}Code-Sprache: JavaScript (javascript)

Unterschied:

  • null: Es wurden keine Datensätze zurückgegeben
  • DBNull.Value: Ein Datensatz wurde gefunden, aber das Feld enthält einen Datenbank‑NULL‑Wert

3. SqlCommand‑Parametersystem (Kernschutz vor SQL‑Injection)

1. Kernobjekt

Die Auflistung SqlCommand.Parameters speichert mehrere SqlParameter‑Objekte. Parametrisierte Abfragen beseitigen SQL‑Injection‑Lücken vollständig.

2. Beispiel für die Parametererstellung
// Parametername, Datentyp, Größe
SqlParameter paramSql = new SqlParameter("@Title", SqlDbType.NVarChar, 250);

// Wert zuweisen
paramSql.Value = model.Title;

// Zum Befehlsobjekt hinzufügen
sqlCom.Parameters.Add(paramSql);Code-Sprache: JavaScript (javascript)
3. ParameterDirection‑Enumeration (Parameterrichtung)
paramSql.Direction = ParameterDirection.Output;
EnumerationsmitgliedWertBeschreibung
Input1Standard, Eingabeparameter (Werte an SQL übergeben)
Output2Ausgabeparameter, holt Ergebnisse nach Ausführung einer gespeicherten Prozedur
InputOutput3Akzeptiert Eingabe und liefert nach Ausführung eine Ausgabe

Vollständiges Code‑Beispiel

private void button1_Click(object sender, EventArgs e)
{
    string connectionString = "Data Source=.;Initial Catalog=db;User ID=sa;Password=xxx";
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        // Sicheres Öffnen der Verbindung
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }

        SqlCommand sqlCom = new SqlCommand();
        sqlCom.Connection = conn;
        sqlCom.CommandTimeout = 60;
        // Nutzen Sie parametrisiertes SQL, niemals String‑Verkettung!
        sqlCom.CommandText = "SELECT [Title] FROM [dbo].[Article] WHERE Title = @Title";

        // Parameter aufbauen
        SqlParameter paramTitle = new SqlParameter("@Title", SqlDbType.NChar, 10);
        paramTitle.Value = "Testtitel";
        sqlCom.Parameters.Add(paramTitle);

        object obj = sqlCom.ExecuteScalar();
        if (obj == null || obj == DBNull.Value)
        {
            MessageBox.Show("Ergebnis ist null");
        }
        else
        {
            MessageBox.Show(obj.ToString());
        }
    }
}Code-Sprache: JavaScript (javascript)

Wichtige Entwicklungsrichtlinien

  1. Keine SQL‑String‑Verkettung, verwenden Sie immer SqlParameter für Parametrisierung;
  2. Nutzen Sie für alle SqlConnection und SqlCommand bevorzugt using zur automatischen Ressourcenfreigabe;
  3. Prüfen Sie bei ExecuteScalar stets sowohl null + DBNull.Value;
  4. Unterscheiden Sie CommandTimeout (SQL‑Ausführungs‑Timeout) und Connect Timeout in der Verbindungszeichenfolge (Verbindungsaufbau‑Timeout).

Ausführungsoptimierung und Parameterübergabe

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert