Câu trả lời ngắn gọn là bạn nên đặt ký tự đại diện trong Giá trị của tham số, không phải trong Văn bản lệnh. tức là
không phải vậy:sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode%"
cái này:
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode";
sqlCommand.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = postCode + "%";
Câu trả lời dài ở đây:
Tôi đã quay lại và rút mã của mình xuống các yếu tố cần thiết để tôi có thể đăng nó ở đây và trong khi làm điều đó, tôi phát hiện ra rằng phương pháp cuối cùng mà tôi đã thử trong câu hỏi ban đầu của mình thực sự hoạt động. Chắc hẳn đã có gì đó sai trong thử nghiệm của tôi. Vì vậy, đây là một bản tóm tắt, với mã đầy đủ đã được chạy:
Sql động ban đầu, dễ bị chèn sql:
//Dynamic sql works, returns 2 results as expected,
//but I want to use parameters to protect against sql injection
string postCode = "G20";
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE '"
+ postCode + "%'";
return Database.fGetDataSet(sqlCommand,
iiStartRecord,
iiMaxRecords,
"JOBVISIT");
Nỗ lực đầu tiên sử dụng tham số gây ra lỗi:
//This syntax with a parameter gives me an error
//(note that I've added the NVarChar length as suggested:
//System.FormatException : @postcode : G20 -
//Input string was not in a correct format.
//at System.Data.SqlServerCe.SqlCeCommand.FillParameterDataBindings()
//at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommandText(IntPtr& pCursor,
// Boolean& isBaseTableCursor)
string postCode = "G20";
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode
+ '%'";
sqlCommand.Parameters.Add("@postcode",
SqlDbType.NVarChar,
10).Value = postCode;
return Database.fGetDataSet(sqlCommand, iiStartRecord, iiMaxRecords, "JOBVISIT");
Kỹ thuật thứ hai thực sự hoạt động:
///This syntax with a parameter works, returns 2 results as expected
string postCode = "G20";
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode";
sqlCommand.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = postCode
+ "%";
return Database.fGetDataSet(sqlCommand, iiStartRecord, iiMaxRecords, "JOBVISIT");
Cảm ơn tất cả thông tin đầu vào và xin lỗi về câu hỏi gây hiểu lầm ban đầu ...