सभी पैरामीटर नामों को उनके मानों से बदलने वाला एक साधारण लूप आपको अंतिम परिणाम के समान कुछ प्रदान करेगा, लेकिन कई समस्याएं हैं।
- चूंकि SQL को वास्तव में कभी भी पैरामीटर मानों का उपयोग करके दोबारा नहीं बनाया जाता है, इसलिए न्यूलाइन्स और कोट्स जैसी चीजों पर विचार करने की आवश्यकता नहीं है
- टिप्पणियों में पैरामीटर नामों को वास्तव में उनके मूल्य के लिए संसाधित नहीं किया जाता है, लेकिन जैसा है वैसा ही छोड़ दिया जाता है
उन लोगों के साथ, और उन पैरामीटर नामों को ध्यान में रखते हुए जो समान वर्णों से शुरू होते हैं, जैसे @NAME
और @NAME_FULL
, हम सभी पैरामीटर नामों को उस मान से बदल सकते हैं जो उस पैरामीटर के स्थान पर होगा:
string query = cmd.CommandText;
foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
query = query.Replace(p.ParameterName, p.Value.ToString());
}
हालाँकि, इसके साथ एक समस्या बची है, और वह यह है कि यदि कोई पैरामीटर एक स्ट्रिंग है, तो SQL जो शुरू में इस तरह दिखता है:
SELECT * FROM yourtable WHERE table_code = @CODE
इस तरह दिखेगा:
SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES
यह स्पष्ट रूप से कानूनी SQL नहीं है, इसलिए हमें कुछ पैरामीटर-प्रकारों को भी ध्यान में रखना होगा:
DbType[] quotedParameterTypes = new DbType[] {
DbType.AnsiString, DbType.Date,
DbType.DateTime, DbType.Guid, DbType.String,
DbType.AnsiStringFixedLength, DbType.StringFixedLength
};
string query = cmd.CommandText;
var arrParams = new SqlParameter[cmd.Parameters.Count];
cmd.Parameters.CopyTo(arrParams, 0);
foreach (SqlParameter p in arrParams.OrderByDescending(p => p.ParameterName.Length))
{
string value = p.Value.ToString();
if (quotedParameterTypes.Contains(p.DbType))
value = "'" + value + "'";
query = query.Replace(p.ParameterName, value);
}