Jednoduchá smyčka nahrazující všechny názvy parametrů jejich hodnotami vám poskytne něco podobného tomu, jaký je konečný výsledek, ale je zde několik problémů.
- Vzhledem k tomu, že SQL není ve skutečnosti nikdy přestavěn pomocí hodnot parametrů, není třeba brát v úvahu věci jako nové řádky a uvozovky
- Názvy parametrů v komentářích nejsou ve skutečnosti nikdy zpracovány podle jejich hodnoty, ale ponechány tak, jak jsou
S těmi, které jsou na místě, as ohledem na názvy parametrů, které začínají stejnými znaky, například @NAME
a @NAME_FULL
, můžeme všechny názvy parametrů nahradit hodnotou, která by byla na místě daného parametru:
string query = cmd.CommandText;
foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
query = query.Replace(p.ParameterName, p.Value.ToString());
}
zůstává zde však jeden problém, a to pokud je parametrem řetězec, pak SQL, který zpočátku vypadá takto:
SELECT * FROM yourtable WHERE table_code = @CODE
bude vypadat takto:
SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES
Toto zjevně není legální SQL, takže musíme počítat také s některými typy parametrů:
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);
}