Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Eliminazione record da un database SQL Server
giovedì 13 aprile 2006 - 11.19
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
max1850
Profilo
| Junior Member
142
messaggi | Data Invio:
gio 13 apr 2006 - 11:19
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
208
messaggi | Data Invio:
gio 13 apr 2006 - 11:33
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
180
messaggi | Data Invio:
gio 13 apr 2006 - 12:38
>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
142
messaggi | Data Invio:
gio 13 apr 2006 - 12:44
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
208
messaggi | Data Invio:
gio 13 apr 2006 - 13:11
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
142
messaggi | Data Invio:
gio 13 apr 2006 - 13:41
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
208
messaggi | Data Invio:
gio 13 apr 2006 - 13:52
>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
142
messaggi | Data Invio:
gio 13 apr 2006 - 14:15
> 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
208
messaggi | Data Invio:
gio 13 apr 2006 - 14:25
>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
142
messaggi | Data Invio:
gio 13 apr 2006 - 14:53
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
180
messaggi | Data Invio:
gio 13 apr 2006 - 15:25
>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
Torna su
Stanze Forum
Elenco Threads
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 !