C#文字取代時候遇到的坑_ADO.NET如何獲取已串入參數值的SQL指令字串
常用ADO.NET的開發者
不免就會遇到維護上時常會因為要偵錯程式兜出來的SQL Statement
而會有需要看運行時期到底錯在哪
這時會突然感覺微軟的ADO.NET實在是有點美中不足
不支援直接獲取串入Parameter後的最終SQL 指令字串
(NodeJs的MySQL api則有支援這種功能啊...)
所以還要自己後製取代處理
A way to see query after parameters are applied?
不過直接用Replace就會遇到一個可怕潛在的BUG
右邊是被取代後的最終SQL指令字串
可以看到由於Parameter Name有一個剛好是符合其他Parameter Name某部分子字串
使取代出現異常
建議改採用Regex來做 Full Match 字串的取代
還有在取愛過程要做一些跳脫字元處理
此外Regex 取代 "@...." at symbol起始的字測試起來沒辦法match
所以在之前先取代成p_ 前墜
使其一定是唯一參數欄位名稱
1 2 3 4 5 6 7 | string qryText = sqlCmd.CommandText; foreach (SqlParameter p in sqlCmd.Parameters) { string isQuted = (p.Value is string) ? "'" : ""; qryText = Regex.Unescape(Regex.Replace(Regex.Escape(qryText.Replace("@", "p_")), @"\b" + p.ParameterName.Replace("@", "p_") + @"\b", isQuted + Regex.Escape(p.Value.ToString()) + isQuted)).Replace("p_", "@"); //qryText = qryText.Replace(p.ParameterName, isQuted + p.Value.ToString() + isQuted); } |
這樣就能達成只要取代Parameter部分的字串了
留言
張貼留言