Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak używać parametru z LIKE w Sql Server Compact Edition

Krótka odpowiedź brzmi, że należy umieścić symbol wieloznaczny w Value parametru, a nie w CommandText. czyli

nie, że:sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode%"

to:

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

Długa odpowiedź tutaj:

Wróciłem i rozebrałem swój kod do niezbędnego minimum, aby móc go tutaj opublikować. Robiąc to, odkryłem, że ostatnia metoda, którą wypróbowałem w moim pierwotnym pytaniu, faktycznie działa. W moich testach musiało być coś nie tak. Oto podsumowanie, z pełnym kodem, który został uruchomiony:

Oryginalny dynamiczny sql, podatny na wstrzyknięcie 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");

Pierwsza próba użycia parametru powoduje błąd:

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

Druga technika rzeczywiście działa:

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

Dziękujemy za wszystkie uwagi i przepraszam za wprowadzające w błąd pytanie...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyzwalacze logowania w SQL Server

  2. Wielodomenowe logowanie do serwera SQL przy użyciu uwierzytelniania systemu Windows

  3. Jak utworzyć ograniczenie sprawdzania wielu tabel?

  4. Jak serializować duży wykres obiektu .NET do obiektu BLOB programu SQL Server bez tworzenia dużego bufora?

  5. Jak wybrać tylko pierwsze wiersze dla każdej unikalnej wartości kolumny?