LIKE e Parametri

venerdì 22 dicembre 2006 - 11.16

adima80 Profilo | Junior Member

Ciao,
sto usando sql server 2005 e ho un problema con il LIKE. Mi spiego, se cerco di usare il LIKE con i parametri da c# nn funziona per niente. Ho già consultato il forum ed ho trovato alcuni thread che nn hanno risolto il mio problema.

es:
string cognome = "ROS"; sqlCmd = "SELECT * FROM Anagrafica WHERE Ana_Cognome LIKE @Cognome"; sqlCmd.Parameters.Add(new SqlParameter("@Cognome", SqlDbType.Char)); sqlCmd.Parameters["@Cognome"].Value = "%"+cognome+"%";

Non mi ritorna niente. se invece provo a far così

string cognome = "ROS"; sqlCmd = "SELECT * FROM Anagrafica WHERE Ana_Cognome LIKE '%" +cognome+"%'";
Funziona, ma nn è una soluzione nè bella esteticamente ne sicura.
La mia domanda in pratica è: come uso i parametri con LIKE?

Grazie per l'attenzione

amelix Profilo | Expert

Io l'ho sempre usato e mi ha sempre funzionato...
L'unica differenza che vedo é nella definizione del tipo dato
sqlCmd.Parameters.Add(new SqlParameter("@Cognome", SqlDbType.Char));
[/code]Io avrei uso una cosa simile:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Se non sbaglio Char è "fisso".


Andrea

us01739 Profilo | Expert

Se non dico una asinata (.. etutto può essere ;-) ..), devi togliere il simbolo % in quanto con il like vengono messi in automatico


Bye Bye

---------------------------------------------------
Roberto Gelmini - Microsoft Certified Professional
www.robertogelmini.com
---------------------------------------------------

amelix Profilo | Expert

Non credo... (l'ho appena provato)


Andrea

us01739 Profilo | Expert

Prova così:

sqlCmd.Parameters["@Cognome"].Value = "'%'"+cognome+"'%'";

Ho notato che in una mia query, il % è tra apici singoli...

Bye Bye

---------------------------------------------------
Roberto Gelmini - Microsoft Certified Professional
www.robertogelmini.com
---------------------------------------------------

lbenaglia Profilo | Guru

>La mia domanda in pratica è: come uso i parametri con LIKE?

Ciao Adima80,

ti allego il seguente esempio:

USE tempdb; GO CREATE TABLE dbo.Students( StudentID int NOT NULL IDENTITY PRIMARY KEY, FirstName varchar(10) NOT NULL, LastName varchar(10) NOT NULL ); GO INSERT dbo.Students VALUES('Lorenzo', 'Benaglia'); INSERT dbo.Students VALUES('Luca', 'Bianchi'); INSERT dbo.Students VALUES('Andrea', 'Benedetti'); INSERT dbo.Students VALUES('Andrea', 'Montanari'); GO DROP TABLE dbo.Students;


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Il mio suggerimento è quello di incapsulare la query in una stored procedure parametrica, in modo da sfruttare tutti i vantaggi offerti dalle stored procedure:
http://tinyurl.com/s662
http://tinyurl.com/s664

>Grazie per l'attenzione
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

lbenaglia Profilo | Guru

>sqlCmd.Parameters["@Cognome"].Value = "'%'"+cognome+"'%'";
>
>Ho notato che in una mia query, il % è tra apici singoli...

Ciao Roberto,

gli apici singoli si utilizzano in T-SQL per delimitare dei literals stringa.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

us01739 Profilo | Expert

Ciao Lorenzo,
avevo suggerito gli apici singoli perchè ho notato che in una query simile a quella del post ma generata automaticamente da VS2005 erano presenti... anche se come giustamente hai suggerito tu, non dovrebbero essere in quel punto

.. concordo che con il QA non funzionerebbe mai...

Grazie 1000 comunque per l'utile precisazione.
Bye Bye

---------------------------------------------------
Roberto Gelmini - Microsoft Certified Professional
www.robertogelmini.com
---------------------------------------------------

adima80 Profilo | Junior Member

Grazie a tutti, siete stati molto cortesi.
Provo subito. Da quello che ho capito il tipo char va un pò in contrasto con il LIKE, ho notato che nessuno di voi ha provato esempi di codice con quel tipo dato. Mi sbaglio?


Ciao e tanti auguri!

amelix Profilo | Expert

Il tipo char "non è conveniente" xchè occupa sempre lo spazio anche se li campo è vuoto e, se fai un IsNull("NomeCampo") non avrai il risultato sperato...

A.
Andrea

lbenaglia Profilo | Guru

>Il tipo char "non è conveniente" xchè occupa sempre lo spazio
>anche se li campo è vuoto
Vero, lo spazio allocato è indipendente dal numero di caratteri inseriti nella colonna|variabile:

USE tempdb; DECLARE @myCharVar char(10); SET @myCharVar = 'Lorenzo' SELECT LEN(@myCharVar) AS Caratteri , DATALENGTH(@myCharVar) AS BytesAllocati; /* Output: Caratteri BytesAllocati ----------- ------------- 7 10 (1 row(s) affected) */ DECLARE @myVarcharVar varchar(10); SET @myVarcharVar = 'Lorenzo' SELECT LEN(@myVarcharVar) AS Caratteri , DATALENGTH(@myVarcharVar) AS BytesAllocati; /* Output: Caratteri BytesAllocati ----------- ------------- 7 7 (1 row(s) affected) */

>e, se fai un IsNull("NomeCampo") non
>avrai il risultato sperato...
Cioè? A me non risulta.

USE tempdb; DECLARE @myCharVar char(15); SET @myCharVar = NULL SELECT ISNULL(@myCharVar, 'Valore NULL') AS Valore /* Output: Valore --------------- Valore NULL (1 row(s) affected) */

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5