Един прост цикъл, заместващ всички имена на параметри с техните стойности, ще ви осигури нещо подобно на крайния резултат, но има няколко проблема.
- Тъй като 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);
}