DataSet 中字符串字段值顯示為 "張三...................."(含大量尾隨空格),導致 if (val == "張三") 判斷失敗。
char(50)/nchar(50) 是**定長類型**,存儲時自動右填充空格至定長。varchar/nvarchar 才是變長,不填充。| 層面 | 方案 | 優缺點 |
|---|---|---|
| 數據庫層(推薦) | 改字段類型為 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() 習慣並封裝通用讀取器,配合參數化查詢徹底規避比較失敗與注入風險。