En simpel løkke, der erstatter alle parameternavne med deres værdier, vil give dig noget, der ligner slutresultatet, men der er flere problemer.
- Da SQL'en faktisk aldrig bliver genopbygget ved hjælp af parameterværdierne, behøver ting som nye linjer og anførselstegn ikke tages i betragtning
- Parameternavne i kommentarer behandles aldrig for deres værdi, men efterlades som de er
Med dem på plads og under hensyntagen til parameternavne, der starter med de samme tegn, såsom @NAME
og @NAME_FULL
, kan vi erstatte alle parameternavne med den værdi, der ville være i stedet for den parameter:
string query = cmd.CommandText;
foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
query = query.Replace(p.ParameterName, p.Value.ToString());
}
der er dog et problem tilbage med dette, og det er, hvis en parameter er en streng, så ser SQL'en, der oprindeligt ser sådan ud:
SELECT * FROM yourtable WHERE table_code = @CODE
vil se sådan ud:
SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES
Dette er tydeligvis ikke lovlig SQL, så vi skal også tage højde for nogle parametertyper:
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);
}