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

Sådan bruger du parameter med LIKE i SQL Server Compact Edition

Det korte svar er, at du skal sætte jokertegnet i værdien af ​​parameteren, ikke i CommandText. dvs.

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

dette:

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

Langt svar her:

Jeg gik tilbage og strippede min kode ned til det væsentlige, så jeg kunne poste den her, og mens jeg gjorde det, opdagede jeg, at den sidste metode, jeg prøvede i mit oprindelige spørgsmål, faktisk virker. Der må have været noget galt i min test. Så her er en oversigt med fuld kode, der er blevet kørt:

Original dynamisk sql, sårbar over for sql-injektion:

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

Første forsøg på at bruge parameter giver en fejl:

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

Anden teknik virker faktisk:

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

Tak for alle input, og undskyld det oprindelige vildledende spørgsmål...



  1. Sådan migreres fra Oracle DB til MariaDB

  2. Sikkerhedskopier en enkelt tabel med dens data fra en database i sql server 2008

  3. PIVOT-forespørgsel på distinkte poster

  4. Returner ISO-ugenummeret fra en dato i SQL Server (T-SQL)