sql >> Databáze >  >> RDS >> Sqlserver

Jak používat parametr s LIKE v SQL Server Compact Edition

Krátká odpověď je, že byste měli vložit zástupný znak do hodnoty parametru, nikoli do CommandTextu. tj.

ne že:sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode%"

toto:

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

Dlouhá odpověď zde:

Vrátil jsem se a zkrátil svůj kód na to nejpodstatnější, abych ho sem mohl zveřejnit, a přitom jsem zjistil, že poslední metoda, kterou jsem zkoušel v mé původní otázce, skutečně funguje. Při mém testování muselo být něco špatně. Zde je shrnutí s úplným kódem, který byl spuštěn:

Původní dynamický sql, zranitelný vůči vkládání 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");

První pokus o použití parametru zobrazí chybu:

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

Druhá technika skutečně funguje:

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

Děkuji za všechny příspěvky a omlouvám se za původní zavádějící otázku...



  1. Datové typy VARCHAR a NVARCHAR v SQL Server

  2. Jak převést DateTime na VarChar

  3. Vložení objektu datetime.datetime Pythonu do MySQL

  4. Odebrání seznamu zapamatovaných přihlašovacích údajů a hesel v SQL Server Management Studio