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

C# DataSet 讀取 SQL Server char/nchar 字段帶尾隨空格:Trim 與參數化查詢雙重保障

     編輯:程式設計綜合問答

現象

DataSet 中字符串字段值顯示為 "張三...................."(含大量尾隨空格),導致 if (val == "張三") 判斷失敗。

根因

  • SQL Server char(50)/nchar(50) 是**定長類型**,存儲時自動右填充空格至定長。
  • varchar/nvarchar 才是變長,不填充。
  • ADO.NET 讀取時**保留了填充空格**,不會自動 Trim。

解決方案對比

層面方案優缺點
數據庫層(推薦)改字段類型為 varchar/nvarchar徹底解決,節省空間,但需評估現有數據遷移影響
查詢層SQL 用 RTRIM(LTRIM(col)) 或 TRIM(col) (SQL Server 2017+)無需改表結構,查詢稍慢,需所有查詢統一加
代碼層讀取後 val = val.Trim() 或擴展方法 GetStringTrimmed()最靈活,但易漏加,建議封裝通用讀取器

最佳實踐:封裝安全讀取擴展方法

public static class DataRowExtensions {
    public static string GetStringSafe(this DataRow row, string columnName) {
        var val = row[columnName];
        return val == DBNull.Value ? "" : val.ToString().Trim();
    }
}

// 用法
string name = row.GetStringSafe("UserName");  // 自動 Trim + 處理 DBNull
if (name == "張三") { ... }

補充:參數化查詢防注入

原代碼若拼接 SQL 字符串,尾隨空格還可能導致參數匹配失敗('張三 ' != '張三')。**務必用參數化查詢**,ADO.NET 會自動處理類型與長度。

總結

DataSet 讀 char/nchar 帶空格是定長類型特性。根治改 varchar,次治 SQL TRIM,養成代碼端 .Trim() 習慣並封裝通用讀取器,配合參數化查詢徹底規避比較失敗與注入風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved