Eliminazione record da un database SQL Server

giovedì 13 aprile 2006 - 11.19

max1850 Profilo | Junior Member

Salve!
Uso VB NET 2005 e SQL Server 2005.
Non riesco a cancellare un record da un database sql server tramite una query parametrizzata.
Posto sotto il codice di un bottone presente in una mia form:

Private Sub Elimina_Par_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Elimina_Par.Click
' Controlliamo che il database sia aperto
If Db.State = ConnectionState.Closed Then Db.Open()
' Creiamo l'istanza di comando
Dim cm As New SqlCommand
' Assegno la connessione all'istanza di comando
cm.Connection() = Db

' Assegno la query al comando
cm.CommandText() = "DELETE FROM Condomini WHERE (Cognome LIKE @Cognome)"
Try
' Costruiamo il parametro da inserire
Dim prm As SqlParameter

' Parametro per il campo Cognome che usiamo per cancellare il record
prm = New SqlParameter("@Cognome", SqlDbType.VarChar)
prm.DbType = DbType.String
prm.Value = "Priva"
cm.Parameters.Add(prm)

' Specifico il tipo di comando
cm.CommandType() = CommandType.Text
' Eseguo la query di cancellazione
cm.ExecuteNonQuery()
MsgBox("Cancellazione Effettuata!")

'Se viene sollevata una eccezione (se si verifica un errore) il Catch lo gestisce
Catch '(ex As Exception)
appErr.errcode = CType(Err.Number, String)
appErr.errmsg = Err.Description
MessageBox.Show(appErr.errmsg, "Errore N°" + CType(appErr.errcode, String), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)

End Try
' Eliminiamo l'istanza command
cm.Dispose()
' Chiudiamo il database
Db.Close()
End Sub
--------------------------

Errori non ne segnala, ma la procedura non cancella nessun record. Cos'è che non va?
Grazie
Max!

sanbiz Profilo | Senior Member

Se utilizzi il like devi utilizzare il carattere % per indicare la perte di testo non da confrontare

"DELETE FROM Condomini WHERE (Cognome LIKE 'Priva%') "

Che utilizzando un parametro si traduce in

@Cognome = "Priva%"
"DELETE FROM Condomini WHERE (Cognome LIKE @Cognome ) "


--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

escaflowne Profilo | Junior Member

>Se utilizzi il like devi utilizzare il carattere % per indicare
>la perte di testo non da confrontare
>
>"DELETE FROM Condomini WHERE (Cognome LIKE 'Priva%') "
>
>Che utilizzando un parametro si traduce in
>
>@Cognome = "Priva%"
>"DELETE FROM Condomini WHERE (Cognome LIKE @Cognome ) "
>
>
>--
>Sandro Bizioli
>http://blogs.dotnethell.it/sandro/

Occhio, però, agli effetti "collaterali" del like
Devi essere sicuro che non ci siano altri cognomi simili altrimenti cancelli anche il non voluto.
Io, sinceramente, non userei il LIKE per la cancellazione di un record, tanto più non cancellerei parametrizzando una stringa, meglio se si utilizzassero valori "certi" (tipo l'id)

max1850 Profilo | Junior Member

Ciao!
Si, avevo dimenticato il "%". Infatti, ho cambiato la riga in:
prm.Value = "Priva%"
e funziona tutto bene!
Ora, ho provato a fare la stessa cosa con il "Modifica record", ma mi modifica il record inserendoci nel Cognome il segno di "%".
Come mai?
Posto sotto il codice di un bottone che appunto dovrebbe modificare un record:


Private Sub Modifica_Par_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Modifica_Par.Click
' Controlliamo che il database sia aperto
If Db.State = ConnectionState.Closed Then Db.Open()
' Creiamo l'istanza di comando
Dim cm As New SqlCommand
' Assegno la connessione all'istanza di comando
cm.Connection() = Db
' Assegniamo la query al comando
cm.CommandText = "UPDATE Condomini SET Nome = @Nome, Cognome = @Cognome, Telefono = @Telefono WHERE (Cognome LIKE @Cognome)"
Try
' Costruiamo il parametro da inserire
Dim prm As SqlParameter

' Parametro per il campo Nome
prm = New SqlParameter("@Nome", SqlDbType.VarChar)
prm.DbType = DbType.String
prm.Value = "Cacca"
cm.Parameters.Add(prm)

' Parametro per il campo Cognome
prm = New SqlParameter("@Cognome", SqlDbType.VarChar)
prm.DbType = DbType.String
prm.Value = "Priva"
cm.Parameters.Add(prm)

' Parametro per il campo Telefono
prm = New SqlParameter("@Telefono", SqlDbType.VarChar)
prm.DbType = DbType.String
prm.Value = "999999"
cm.Parameters.Add(prm)

' Specifico il tipo di comando, che deve essere di testo
cm.CommandType() = CommandType.Text
' Eseguo la query di cancellazione
cm.ExecuteNonQuery()
MsgBox("Modifica Effettuata!")

'Se viene sollevata una eccezione (se si verifica un errore) il Catch lo gestisce
Catch '(ex As Exception)
appErr.errcode = CType(Err.Number, String)
appErr.errmsg = Err.Description
MessageBox.Show(appErr.errmsg, "Errore N°" + CType(appErr.errcode, String), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)

End Try
' Eliminiamo l'istanza command
cm.Dispose()
' Chiudiamo il database
Db.Close()
End Sub
---------------------

Grazie
Max!

P.S.: x escaflowne
Hai perfettamente ragione, ma a me serve giusto come esempio

sanbiz Profilo | Senior Member

Beh, se imposti il segno di % all'interno del parametro per sql è un carattere come altri e se fai un update verrà usato come tale.

Non puoi fare unìistruzione come quella che hai preparato. Sarebbe il caso che utilizzassi

@Cognome = "MioCognome"
@Nome = "MioNome"
@Ricerca = "miaRicerca%"

cm.CommandText = "UPDATE Condomini SET Nome = @Nome, Cognome = @Cognome where cognome like @cognome"

--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

max1850 Profilo | Junior Member

Ciao!
Non ho capito molto bene...allora ho tolto la "%" dal valore del parametro ed ho usato la query:
cm.CommandText = "UPDATE Condomini SET Nome = @Nome, Cognome = @Cognome where cognome like @cognome"
ma non va.

Mi puoi gentilmente scrivere le righe di codice da modificare?
Grazie
Max!

sanbiz Profilo | Senior Member

>Ciao!
>Non ho capito molto bene...allora ho tolto la "%" dal valore
>del parametro ed ho usato la query:
>cm.CommandText = "UPDATE Condomini SET Nome = @Nome, Cognome
>= @Cognome where cognome like @cognome"
>ma non va.
>
No. Se fai come hai scritto tu non fa nulla perchè la clausola like non contine il simbolo %.
Inoltre c'è un problema di logica: se in @cognome ci fosse "parteDelCognome%" tu chiedi di aggiornare la tabella Condomini modificando il Nome = @Nome e Cognome = parteDelCognome%! E' errato.

Crea una variabile di ricerca del cognome che chiameremo @Ricerca e che imposteremo = "parteDelCognome%" (inserendovi il segno di %)
Aggiungiamo i parametri di aggiornamento e cioè @Nome = "NuovoNome" e @Cognome = "NuovoCognome"

Riscriviamo la query:
cm.CommandText = "UPDATE Condomini SET Nome = @Nome, Cognome = @Cognome where cognome like @Ricerca"

Che verrà risolta da SQL in:
UPDATE Condomini SET Nome = 'NuovoNome', Cognome = 'NuovoCognome' where cognome like 'parteDelCognome%'

Capisci che è diverso da quello che facevi tu?
UPDATE Condomini SET Nome = 'NuovoNome', Cognome = 'parteDelCognome%' where cognome like 'parteDelCognome%'





--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

max1850 Profilo | Junior Member

> Capisci che è diverso da quello che facevi tu?
> UPDATE Condomini SET Nome = 'NuovoNome', Cognome = 'parteDelCognome%' where cognome like 'parteDelCognome%'
>
Si, in effetti c'è molta differenza!
Capisco cosa vuoi dire, ma non riesco a capire come scriverle.
Ho cercato di creare la variabile @Ricerca con l'istruzione Dim, ma non accetta la "@". E poi i parametri di aggiornamento di NuovoNome e NuovoCognome dove li inserisco?

Potresti gentilmente modificare direttamente le linee del mio programma (postato su) così capisco prima? Oppure scrivere le linee da inserire?

Purtroppo sono anora "novizio"... grazie della pazienza che stai avendo
Max!

sanbiz Profilo | Senior Member

>Si, in effetti c'è molta differenza!
>Capisco cosa vuoi dire, ma non riesco a capire come scriverle.
>Ho iniziato a creare la variabile @Ricerca con l'istruzione Dim,
>ma non accetta la "@". E poi i parametri di aggiornamento di
>NuovoNome e NuovoCognome dove li inserisco?

Mi sono spiegato male, non è una variabile, ma parametri, proprio come avevi fattu tu:

' Parametro per il campo Nome
prm = New SqlParameter("@Nome", SqlDbType.VarChar)
prm.DbType = DbType.String
prm.Value = "Cacca"
cm.Parameters.Add(prm)

' Parametro per il campo Cognome
prm = New SqlParameter("@Cognome", SqlDbType.VarChar)
prm.DbType = DbType.String
prm.Value = "Priva"
cm.Parameters.Add(prm)

' Parametro per il campo Telefono
prm = New SqlParameter("@Telefono", SqlDbType.VarChar)
prm.DbType = DbType.String
prm.Value = "999999"
cm.Parameters.Add(prm)

' Parametro per il campo Ricerca
prm = New SqlParameter("@Ricerca", SqlDbType.VarChar)
prm.DbType = DbType.String
prm.Value = "parteDelCognome%"
cm.Parameters.Add(prm)

' Assegno la query al comando
cm.CommandText = "UPDATE Condomini SET Nome = @Nome, Cognome = @Cognome, Telefono = @Telefono Where cognome like @Ricerca"


--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

max1850 Profilo | Junior Member

Ciao!
Ecco...ora funziona!
In pratica si doveva aggiungere il nuovo parametro "@Ricerca" col valore da modificare al cognome e inserirlo nella query dopo il LIKE!

Molte grazie per l'aiuto!
Ciao
Max!

escaflowne Profilo | Junior Member

>Ciao!
>Ecco...ora funziona!
>In pratica si doveva aggiungere il nuovo parametro "@Ricerca"
>col valore da modificare al cognome e inserirlo nella query dopo
>il LIKE!
>
>Molte grazie per l'aiuto!
>Ciao
>Max!

ciao, segnala uno dei thread di risposta di sanbiz come risposta accettata, così chi legge l'indice del forum sa che il problema è stato risolto
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