Một vòng lặp đơn giản thay thế tất cả các tên tham số bằng các giá trị của chúng sẽ cung cấp cho bạn điều gì đó tương tự như kết quả cuối cùng, nhưng có một số vấn đề.
- Vì SQL thực sự không bao giờ được xây dựng lại bằng cách sử dụng các giá trị tham số, những thứ như dòng mới và dấu ngoặc kép không cần phải xem xét
- Tên thông số trong nhận xét không bao giờ thực sự được xử lý theo giá trị của chúng, nhưng vẫn giữ nguyên trạng thái
Với những điều đó tại chỗ và tính đến tên thông số bắt đầu bằng các ký tự giống nhau, chẳng hạn như @NAME
và @NAME_FULL
, chúng ta có thể thay thế tất cả các tên tham số bằng giá trị ở vị trí của tham số đó:
string query = cmd.CommandText;
foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
query = query.Replace(p.ParameterName, p.Value.ToString());
}
Tuy nhiên, có một vấn đề còn lại với điều này và đó là nếu một tham số là một chuỗi, thì SQL ban đầu trông giống như sau:
SELECT * FROM yourtable WHERE table_code = @CODE
sẽ trông như thế này:
SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES
Đây rõ ràng không phải là SQL hợp pháp, vì vậy chúng tôi cũng cần tính đến một số kiểu tham số:
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);
}