Prosta pętla zastępująca wszystkie nazwy parametrów ich wartościami zapewni coś podobnego do końcowego wyniku, ale jest kilka problemów.
- Ponieważ SQL nigdy nie jest odbudowywany przy użyciu wartości parametrów, takie rzeczy jak znaki nowej linii i cudzysłowy nie muszą być brane pod uwagę
- Nazwy parametrów w komentarzach nigdy nie są przetwarzane ze względu na ich wartość, ale pozostawiane bez zmian
Mając je na miejscu i biorąc pod uwagę nazwy parametrów, które zaczynają się od tych samych znaków, np. @NAME
i @NAME_FULL
, możemy zastąpić wszystkie nazwy parametrów wartościami, które byłyby w miejscu tego parametru:
string query = cmd.CommandText;
foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
query = query.Replace(p.ParameterName, p.Value.ToString());
}
pozostaje jednak jeden problem, a mianowicie, że jeśli parametr jest łańcuchem, to SQL, który początkowo wygląda tak:
SELECT * FROM yourtable WHERE table_code = @CODE
będzie wyglądać tak:
SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES
Oczywiście nie jest to legalny SQL, więc musimy uwzględnić również niektóre typy parametrów:
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);
}