Perulangan sederhana yang mengganti semua nama parameter dengan nilainya akan memberi Anda sesuatu yang mirip dengan hasil akhirnya, tetapi ada beberapa masalah.
- Karena SQL tidak pernah benar-benar dibangun kembali menggunakan nilai parameter, hal-hal seperti baris baru dan tanda kutip tidak perlu dipertimbangkan
- Nama parameter dalam komentar tidak pernah benar-benar diproses untuk nilainya, tetapi dibiarkan apa adanya
Dengan yang ada, dan dengan mempertimbangkan nama parameter yang dimulai dengan karakter yang sama, seperti @NAME
dan @NAME_FULL
, kita dapat mengganti semua nama parameter dengan nilai yang akan menggantikan parameter tersebut:
string query = cmd.CommandText;
foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
query = query.Replace(p.ParameterName, p.Value.ToString());
}
ada satu masalah yang tersisa dengan ini, bagaimanapun, dan itu adalah jika parameter adalah string, maka SQL yang awalnya terlihat seperti ini:
SELECT * FROM yourtable WHERE table_code = @CODE
akan terlihat seperti ini:
SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES
Ini jelas bukan SQL legal, jadi kita perlu memperhitungkan beberapa tipe parameter juga:
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);
}