錯誤堆棧
System.Data.SqlClient.SqlException: 列名 'zz' 無效。
...
string sql1 = "select * from XX where Name=" + Session["name"] + "";
根因
- SQL 字符串拼接缺少引號:
Name=zz 被解析為列名比較,而非字符串值。
Session["name"] 為 zz 時,生成 SQL:select * from XX where Name=zz,數據庫以為 zz 是列名。
- 極大的 SQL 注入風險。
修正代碼(參數化查詢)
string sql = "select * from XX where Name=@name";
using (SqlConnection conn = sc.getSqlConnection()) {
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn)) {
cmd.Parameters.AddWithValue("@name", Session["name"]);
using (SqlDataReader dr = cmd.ExecuteReader()) {
if (dr.Read()) {
Label11.Text = dr["Nicename"].ToString();
Label12.Text = dr["Sex"].ToString();
Label13.Text = dr["PhoneNumber"].ToString();
Label14.Text = dr["Email"].ToString();
}
}
}
}
關鍵點
- 永遠使用參數化查詢,避免拼接。
dr.GetString(dr.GetOrdinal(...)) 可簡化為 dr["col"].ToString()。
- 調試時輸出最終 SQL(
cmd.CommandText 參數值不會顯示,可自行記錄)。