Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách sử dụng tham số với LIKE trong Sql Server Compact Edition

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 ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách nhận tổng tích lũy

  2. Bắt đầu với SQL Server 2017 trên Linux trong cổng Azure

  3. Điều gì xảy ra với một giao dịch không được cam kết khi kết nối bị đóng?

  4. scope_identity so với Id_current

  5. Tự động hóa khôi phục kiểm tra cơ sở dữ liệu trong SQL Server