C#文字取代時候遇到的坑_ADO.NET如何獲取已串入參數值的SQL指令字串

 
常用ADO.NET的開發者
不免就會遇到維護上時常會因為要偵錯程式兜出來的SQL Statement
而會有需要看運行時期到底錯在哪

這時會突然感覺微軟的ADO.NET實在是有點美中不足
不支援直接獲取串入Parameter後的最終SQL 指令字串
(NodeJs的MySQL api則有支援這種功能啊...)

所以還要自己後製取代處理

這作法參考StackOverFlow上人家提供的土法煉鋼解法
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部分的字串了


















留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header