首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# SqlDataAdapter.Fill 報錯「列名無效」:漢字參數缺少引號導致 SQL 拼接錯誤

     編輯:程式設計綜合問答

現象描述

C# 拼接 SQL 執行 sqlDataAdapter.Fill 時,輸入數字正常,輸入漢字(如「你好」)報錯:列名 '你好' 無效。

根本原因

SQL 拼接時漢字值未加單引號,導致數據庫將其解析為列名而非字符串字面量。例如:

// 錯誤拼接
sql = "SELECT * FROM Users WHERE Name = " + txtName.Text; 
// 輸入「你好」生成 → SELECT * FROM Users WHERE Name = 你好  -- 視為列名

// 正確拼接
sql = "SELECT * FROM Users WHERE Name = '" + txtName.Text.Replace("'", "''") + "'";
// 生成 → SELECT * FROM Users WHERE Name = '你好'  -- 視為字符串

根治方案:參數化查詢(拒絕拼接)

string sql = "SELECT * FROM Users WHERE Name = @Name";
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlCommand cmd = new SqlCommand(sql, conn)) {
    cmd.Parameters.AddWithValue("@Name", txtName.Text); // 自動處理引號、轉義、類型
    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    adapter.Fill(dt);
}

參數化查詢的四大優勢

  1. 防 SQL 注入:參數值永遠不會被解析為 SQL 代碼。
  2. 自動類型轉換:無需手動處理日期格式、字符串引號、二進制數據。
  3. 計劃緩存復用:相同 SQL 文本不同參數可復用執行計劃,提升性能。
  4. 代碼可讀性:SQL 與數據分離,易維護。
  5. 常見誤區

    • 「存儲過程不需要參數化」:同樣需要,否則動態 SQL 仍有注入風險。
    • 「AddWithValue 會推斷錯誤類型」:極少數場景(如 CHAR vs VARCHAR、DECIMAL 精度)需顯式 cmd.Parameters.Add("@p", SqlDbType.Char, 10).Value = val;。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved