En enkel loop som ersätter alla parameternamn med deras värden ger dig något som liknar slutresultatet, men det finns flera problem.
- Eftersom SQL faktiskt aldrig byggs om med parametervärdena behöver inte saker som nya rader och citattecken beaktas
- Parameternamn i kommentarer bearbetas aldrig för sitt värde, utan lämnas som de är
Med de på plats och med hänsyn till parameternamn som börjar med samma tecken, som @NAME
och @NAME_FULL
, kan vi ersätta alla parameternamn med värdet som skulle vara i stället för den parametern:
string query = cmd.CommandText;
foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
query = query.Replace(p.ParameterName, p.Value.ToString());
}
Det finns dock ett problem kvar med detta, och det är om en parameter är en sträng, då ser SQL-koden som initialt ser ut så här:
SELECT * FROM yourtable WHERE table_code = @CODE
kommer att se ut så här:
SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES
Detta är helt klart inte laglig SQL, så vi måste ta hänsyn till vissa parametertyper också:
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);
}