Een eenvoudige lus die alle parameternamen door hun waarden vervangt, geeft je iets dat lijkt op wat het eindresultaat is, maar er zijn verschillende problemen.
- Omdat de SQL nooit echt opnieuw wordt opgebouwd met behulp van de parameterwaarden, hoeft u geen rekening te houden met zaken als nieuwe regels en aanhalingstekens
- Parameternamen in opmerkingen worden nooit verwerkt op basis van hun waarde, maar laten zoals ze zijn
Als die er zijn, en rekening houdend met parameternamen die met dezelfde tekens beginnen, zoals @NAME
en @NAME_FULL
, kunnen we alle parameternamen vervangen door de waarde die op de plaats van die parameter zou staan:
string query = cmd.CommandText;
foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
query = query.Replace(p.ParameterName, p.Value.ToString());
}
er is hier echter nog één probleem mee, en dat is als een parameter een string is, dan is de SQL die er aanvankelijk zo uitziet:
SELECT * FROM yourtable WHERE table_code = @CODE
ziet er als volgt uit:
SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES
Dit is duidelijk geen legale SQL, dus we moeten ook rekening houden met enkele parametertypes:
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);
}