Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да използвате параметър с LIKE в Sql Server Compact Edition

Краткият отговор е, че трябва да поставите заместващия знак в стойността на параметъра, а не в CommandText. т.е.

не това:sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode%"

това:

sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode";
sqlCommand.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = postCode + "%";

Дълъг отговор тук:

Върнах се и свалих кода си до най-важното, за да мога да го публикувам тук, и докато правех това открих, че последният метод, който опитах в първоначалния си въпрос, всъщност работи. Сигурно нещо не е наред при тестването ми. И така, ето обобщение с пълния код, който е стартиран:

Оригинален динамичен sql, уязвим към 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");

Първият опит за използване на параметъра дава грешка:

//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");

Втората техника наистина работи:

///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");

Благодаря за всички коментари и съжалявам за първоначалния подвеждащ въпрос...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Добавете колони към съществуваща таблица в базата данни на SQL Server

  2. Създаване на локална база данни на SQL Server

  3. Поправете съобщение 512 „Подзаявката върна повече от 1 стойност“ в SQL Server

  4. Сравнете DATETIME и DATE, пренебрегвайки частта от времето

  5. Как да коригирате „Схемата на дяловете „...“ няма следваща използвана файлова група“ в SQL Server