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
usingwechselt der Status nach der Freigabe automatisch auf Closed.
Häufige Zustände:Open/Closed/Connectingu. 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ückgegebenDBNull.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;
| Enumerationsmitglied | Wert | Beschreibung |
|---|---|---|
| Input | 1 | Standard, Eingabeparameter (Werte an SQL übergeben) |
| Output | 2 | Ausgabeparameter, holt Ergebnisse nach Ausführung einer gespeicherten Prozedur |
| InputOutput | 3 | Akzeptiert 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
- Keine SQL‑String‑Verkettung, verwenden Sie immer
SqlParameterfür Parametrisierung; - Nutzen Sie für alle
SqlConnectionundSqlCommandbevorzugtusingzur automatischen Ressourcenfreigabe; - Prüfen Sie bei ExecuteScalar stets sowohl
null + DBNull.Value; - Unterscheiden Sie
CommandTimeout(SQL‑Ausführungs‑Timeout) undConnect Timeoutin der Verbindungszeichenfolge (Verbindungsaufbau‑Timeout).
Ausführungsoptimierung und Parameterübergabe
Previous: CommandTimeout
Next: ExecuteNonQuery