Come gestire parametri OleDbCommand/SqlCommand quando non si dispone d...

mercoledì 18 giugno 2008 - 21.03

mmsoftware Profilo | Newbie

Esempio:
Statement Sql del comando: (SELECT città, cap, provincia, regione
FROM TABELLA.ELENCO
WHERE città = ? AND
cap= ? AND
provincia = ? AND
regione = ?)
comando.parametro.aggiungi (città)
comando.parametro.aggiungi (cap)
comando.parametro.aggiungi (provincia)
comando.parametro.aggiungi (regione)
Le condizioni da valutare:
A) La chiave è multipla ed è composta da tutti gli attributi espressi, quindi città+cap+provincia+regione;
B) NON SI VOGLIONO UTILIZZARE operatori LIKE;
C) Si sono dichiarati tutti i parametri come nello pseudocodice dell'esempio;
D) Non si vogliono utilizzare concatenazioni nella stringa dello statement SQL in funzione dei criteri+valori espressi;
E) Non si vogliono aggiungere i parametri "al volo" al comando in funzione dei criteri+ valori espressi.
Fino ad ora ho aggirato il problema componendo la stringa dello statement sql di volta in volta in funzione dei criteri da valutare (vedi D) o aggiungendo di volta in volta il parametro solo quando potevo esprimerne il valore es. disponevo del valore provincia e regione aggiungevo solo i parametri per provincia e regione (vedi E). IN POCHE PAROLE ESISTE UN MODO PER ASSEGNARE UN "NON VALORE" AD UN PARAMETRO IN MODO CHE QUESTO NON VENGA ESAMINATO ?




Cteniza Profilo | Guru

Devi impostare la tua stringa selezione sql nel seguente modo;
WHERE (0 = 0)
AND (campo IS NULL) OR (campo = ?)
Poi puoi impostare il valore con dbnull.value nel caso tu li voglia escludere

mmsoftware Profilo | Newbie

Vedo se ho compeso correttamente (la tabella è rappresentata per assurdo):
WHERE ((città IS NULL) OR (città = ?)) AND
((cap IS NULL) OR (cap = ?)) AND
((provincia IS NULL) OR (provincia = ?)) AND
((regione IS NULL) OR (regione = ?))

comando.parametro.aggiungi (città).valore = dbnull.value
comando.parametro.aggiungi (cap).valore = dbnull.value
comando.parametro.aggiungi (provincia).valore = dbnull.value
comando.parametro.aggiungi (regione).valore = "Lombardia"

Mi attendo la proiezione del cap di tutte le città lombarde. Considerando che in Sql, NULL, indica un valore "assenza di valore" e che tutti gli attributi
sono valorizzati perchè elementi della chiave primaria dove non è possibile introdurre valori NULL, secondo le stime la selezione non dovrebbe dare alcun risultato perchè lo statement come da esempio, secondo quello che ho capito, diventerebbe:
select * from elenco where (città = NULL) AND (cap = NULL) AND (provincia = NULL) AND (regione = lombardia) .
Se invece tu mi dici che utilizzando dbnull.value nei parametri, lo statement passato diventa:
select * from elenco where (regione = lombardia) allora RISOLVO TUTTI I PROBLEMI.
Probabilmente la mia superficiale conoscenza del funzionamento dei parametri e del valore DBNULL.VALUE mi hanno portato alla precedente interpretazione.
Comunque provo subito.
Ti ringrazio per ora per il prezioso contributo.


mmsoftware Profilo | Newbie

Ho provato come dicevi, ma non ho ottenuto il risultato atteso. Ti allego il codice per sottoportelo, avrò sicuramente sbagliato qualche cosa.

Dim tdoConnection As New System.Data.SqlClient.SqlConnection(SqlConnection1.ConnectionString)
Dim tdoReader As System.Data.SqlClient.SqlDataReader
Dim tdoSql As String = String.Empty
Dim tdoCmd As New System.Data.SqlClient.SqlCommand

tdoSql = "SELECT citta, provincia, regione, cap " _
& "FROM elenco " _
& "WHERE ((citta IS NULL) OR (citta = @citta)) AND " _
& "((provincia IS NULL) OR (provincia = @provincia)) AND " _
& "((regione IS NULL) OR (regione = @regione)) AND " _
& "((cap IS NULL) OR (cap = @cap)) "

tdoConnection.Open()

tdoCmd.Connection = tdoConnection
tdoCmd.CommandText = tdoSql
tdoCmd.Parameters.Add("@citta", SqlDbType.NVarChar, 50)
tdoCmd.Parameters("@citta").Value = IIf(TextBox1.Text = String.Empty, System.DBNull.Value, TextBox1.Text)
tdoCmd.Parameters.Add("@provincia", SqlDbType.NVarChar, 50)
tdoCmd.Parameters("@provincia").Value = IIf(TextBox2.Text = String.Empty, System.DBNull.Value, TextBox2.Text)
tdoCmd.Parameters.Add("@regione", SqlDbType.NVarChar, 50)
tdoCmd.Parameters("@regione").Value = IIf(TextBox3.Text = String.Empty, System.DBNull.Value, TextBox3.Text)
tdoCmd.Parameters.Add("@cap", SqlDbType.NVarChar, 5)
tdoCmd.Parameters("@cap").Value = IIf(TextBox4.Text = String.Empty, System.DBNull.Value, TextBox4.Text)

tdoReader = tdoCmd.ExecuteReader()

While tdoReader.Read
...
...
End While

tdoReader.Close()
tdoCmd.Dispose()
tdoConnection.Close()

Ciao e grazie ancora
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