Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment utiliser le paramètre avec LIKE dans Sql Server Compact Edition

La réponse courte est que vous devez mettre le caractère générique dans la valeur du paramètre, pas dans le CommandText. c'est-à-dire

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

ceci :

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

Réponse longue ici :

Je suis revenu en arrière et j'ai réduit mon code à l'essentiel afin de pouvoir le publier ici, et ce faisant, j'ai découvert que la dernière méthode que j'ai essayée dans ma question d'origine fonctionne réellement. Il devait y avoir quelque chose qui n'allait pas dans mes tests. Voici donc un résumé, avec le code complet qui a été exécuté :

SQL dynamique d'origine, vulnérable à l'injection 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");

La première tentative d'utilisation du paramètre génère une erreur :

//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 deuxième technique fonctionne réellement :

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

Merci pour toutes vos contributions et désolé pour la question trompeuse d'origine...