sql >> Database >  >> RDS >> Sqlserver

Parameter gebruiken met LIKE in Sql Server Compact Edition

Het korte antwoord is dat u het jokerteken in de waarde van de parameter moet plaatsen, niet in de CommandText. d.w.z.

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

dit:

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

Lang antwoord hier:

Ik ging terug en stripte mijn code tot de essentie, zodat ik hem hier kon posten, en terwijl ik dat deed, ontdekte ik dat de laatste methode die ik in mijn oorspronkelijke vraag probeerde, echt werkt. Er moet iets mis zijn geweest bij mijn testen. Dus hier is een samenvatting, met volledige code die is uitgevoerd:

Originele dynamische sql, kwetsbaar voor sql-injectie:

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

Eerste poging om parameter te gebruiken geeft een fout:

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

Tweede techniek werkt echt:

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

Bedankt voor alle input, en sorry voor de oorspronkelijke misleidende vraag...



  1. Gebruik NEWSEQUENTIALID() om een ​​oplopende GUID te maken in SQL Server

  2. MySQL DROP-DATABASE

  3. 3 manieren om de eerste dag van de maand in SQL Server te krijgen

  4. Gedeeltelijke index niet gebruikt in ON CONFLICT-clausule tijdens het uitvoeren van een upsert in Postgresql