Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come utilizzare il parametro con LIKE in Sql Server Compact Edition

La risposta breve è che dovresti inserire il carattere jolly nel valore del parametro, non nel CommandText. cioè

non quello:sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode%"

questo:

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

Risposta lunga qui:

Sono tornato indietro e ho ridotto il mio codice all'essenziale in modo da poterlo pubblicare qui, e mentre lo facevo ho scoperto che l'ultimo metodo che ho provato nella mia domanda originale funziona davvero. Deve esserci stato qualcosa di sbagliato nel mio test. Quindi ecco un riepilogo, con il codice completo che è stato eseguito:

Sql dinamico originale, vulnerabile all'iniezione di 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");

Il primo tentativo di utilizzare il parametro restituisce un errore:

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

La seconda tecnica funziona davvero:

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

Grazie per tutto il contributo e scusa per la domanda originale fuorviante...