Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwendung von Parametern mit LIKE in Sql Server Compact Edition

Die kurze Antwort lautet, dass Sie den Platzhalter in den Wert des Parameters einfügen sollten, nicht in den Befehlstext. d.h.

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

das:

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

Lange Antwort hier:

Ich ging zurück und reduzierte meinen Code auf das Wesentliche, damit ich ihn hier posten konnte, und dabei entdeckte ich, dass die letzte Methode, die ich in meiner ursprünglichen Frage ausprobiert hatte, tatsächlich funktioniert. Da muss bei meinen Tests etwas schief gelaufen sein. Hier ist also eine Zusammenfassung mit vollständigem Code, der ausgeführt wurde:

Ursprüngliches dynamisches SQL, anfällig für SQL-Injection:

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

Der erste Versuch, den Parameter zu verwenden, gibt einen Fehler:

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

Zweite Technik funktioniert tatsächlich:

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

Danke für all die Beiträge und Entschuldigung für die ursprünglich irreführende Frage...