すべてのパラメーター名をそれらの値に置き換える単純なループは、最終結果と同様の結果を提供しますが、いくつかの問題があります。
- SQLはパラメータ値を使用して実際に再構築されることはないため、改行や引用符などを考慮する必要はありません。
- コメント内のパラメータ名は、実際にその値として処理されることはありませんが、そのまま残されます
それらを配置し、@NAME
のように同じ文字で始まるパラメータ名を考慮に入れます および@NAME_FULL
、すべてのパラメータ名を、そのパラメータの代わりになる値に置き換えることができます:
string query = cmd.CommandText;
foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
query = query.Replace(p.ParameterName, p.Value.ToString());
}
ただし、これには1つの問題が残っています。つまり、パラメータが文字列の場合、最初は次のようになります。
SELECT * FROM yourtable WHERE table_code = @CODE
次のようになります:
SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES
これは明らかに正当なSQLではないため、いくつかのパラメータタイプも考慮する必要があります。
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);
}