2009-12-16 11 views
11

Sto provando a parametrizzare una query di ricerca che utilizza la parola chiave LIKE con un carattere jolly. Lo sql originale ha SQL dinamico come questo:Come utilizzare il parametro con LIKE in Sql Server Compact Edition

"AND JOB_POSTCODE LIKE '" + isPostCode + "%' " 

Così ho provato questo posto, ma ho un FormatException:

"AND JOB_POSTCODE LIKE @postcode + '%' " 

Edit: Credo che il FormatException non sta per essere venuta da Sql Server CE, così come richiesto, ecco come ho impostato il parametro nel mio codice C#. Il parametro è impostato in codice come questo:

command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode; 

Ho anche provato:

"AND JOB_POSTCODE LIKE @postcode" 

con

command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode + "%"; 

ma che non restituisce alcun risultato. Qualcuno può consigliare come utilizzare i parametri in questa ricerca sql?

+0

query full: @ "SELECT * FROM JOB WHERE DELETED = false AND JOB_POSTCODE LIKE '" + isPostCode +'% '" – Colin

risposta

21

La risposta breve è che è necessario inserire il carattere jolly nel valore del parametro, non nel CommandText. cioè

non

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

questo:

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

Risposta lunga qui:

sono tornato e messo a nudo il mio codice verso il basso per gli elementi essenziali in modo che potessi postare qui, e mentre lo facevo ho scoperto che l'ultimo metodo che ho provato nella mia domanda originale funziona davvero. Deve essere stato qualcosa di sbagliato nei miei test. Quindi, ecco una sintesi, con il codice che è stato eseguito:

SQL dinamico originale, vulnerabile a 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"); 

Primo tentativo di utilizzare il parametro dà un errore:

//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 seconda tecnica funziona effettivamente:

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

Grazie per tutti gli input, e mi dispiace per la domanda fuorviante originale ...

+1

SQLCE (o, più probabilmente, il provider) deve avere un problema con l'espressione inline - questo potrebbe essere il motivo per cui il provider genera l'errore.Non ho un banco di prova per SQLCE e non ho nemmeno notato che questa era davvero una domanda di SQL CE fino a quando non avevo già postato la mia prima risposta :-( –

+0

Cade, Grazie per il vostro contributo. Mi ha aiutato a perseverare con il mio codice e test, e mi ha aiutato a spostarmi verso il codice piuttosto che sul sql. – Colin

2

Uso:

"AND JOB_POSTCODE LIKE '" + isPostCode + "%' " 

... significa che la stringa è costruito prima di essere appiccicato SQL dinamico. Questo è così che non è necessario specificare il parametro nella lista dei parametri per sp_executesql/EXEC, mentre questo:

"AND JOB_POSTCODE LIKE @postcode + '%' " 

... fa. Si prega di inviare più della query.

+1

Il sql dinamico funziona ma voglio usare un parametro per proteggere da SQL injection e non riesco a farlo funzionare – Colin

1

Inserisci l'esempio completo (incluso il codice client esterno in cui stai assemblando la chiamata). La seconda e la terza opzione dovrebbero funzionare se si passa il parametro correttamente. Stai chiamando questo in una stored procedure o SQL parametrizzato in linea?

I non si assumono alcuna SP dato che ho appena visto che si sta utilizzando CE ...

Credo che avete bisogno di add a length to your .Add call dal momento che è un nvarchar.

+0

Hai ragione, nessun SP. È sql in linea con parametri. Ho modificato la domanda per aggiungere la riga in cui aggiungo il parametro al comando. Potrebbe essere il SqlDbType.NVarChar il problema? – Colin

+0

Cade, ho provato ad aggiungere la lunghezza e ho scoperto che non faceva alcuna differenza, ma durante altri test ho scoperto che la terza opzione funzionava. Mie scuse. Si prega di vedere la risposta che ho postato per tutti i dettagli. Sono curioso di sapere perché la seconda opzione non ha funzionato ......... – Colin

3

Questo restituisce i risultati appropriati in SQL Server 05 (funziona anche in un SP), quindi sembra che l'ultima cosa che hai provato avrebbe dovuto funzionare. Ma non ho un banco di prova per Compact Edition, quindi forse questo fa la differenza (sarei curioso di vedere se è così, e perché).

declare @p1 nvarchar(50) 
set @p1 = 'f'   -- initial value passed from your app 
set @p1 = @p1 + '%' -- edit value for use with LIKE 
select * from JOB 
where JOB_POSTCODE like @p1 

EDIT:

Quale versione di SQLCE stai usando? Puoi dire se i valori dei parametri sono effettivamente passati dal tuo codice al DB? Ho sfogliato this MSDN tutorial e sono riuscito a ottenere i risultati che stai cercando, almeno da Visual Studio Query Designer. (l'unica differenza è che sto usando VS 2008 e SQL Server Compact 3.5). Vedere la sezione intitolata "Creazione di una nuova query"; Ho preso in giro un tavolo con alcuni dati e questa query ha funzionato come volevi.

SELECT  JobID, PostCode, OtherValue 
FROM   Job 
WHERE  (PostCode LIKE @p1 + '%') 

Come ho detto, non ho scritto alcun codice per chiamare la query, ma ha funzionato all'interno del designer. In altre parole, "funziona sulla mia macchina".

+0

Sql Server CE non consente i parametri denominati e la parola chiave declare non esiste, quindi non posso usare il tuo sql . Non so come assegnare un parametro senza nome in Management Studio. Stavo provando questo: SELECT * FROM JOB WHERE JOB_POSTCODE LIKE? + '%', 'G20' ma la sintassi non è corretta – Colin

+1

@Colin, penso di aver imparato di più dal tuo commento rispetto a quello che hai ricevuto dalla mia risposta;) - forse la modifica aiuta? – Matt

+0

Matt, Grazie per il collegamento, ora sarò in grado di testare le query parametrizzate al di fuori del mio codice (ho cercato di farlo in Management Studio anziché in Server Explorer). Non penso che l'errore provenga da SqlServerCE, penso che provenga dal provider di dati .NET Compact Framework - vedi la risposta che ho postato per il testo dell'errore. Per la cronaca sto usando VS2005 e Sql Server Compact 3.5 – Colin

-1

tua risposta è:

"AND JOB_POSTCODE LIKE '' + @postcode + '%' " 

e il parametro:

command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode; 
Problemi correlati