Funzione "Aggiorna" e funzione "Cancella"

venerdì 16 novembre 2007 - 21.10

172690 Profilo | Junior Member

Salve a tutti.
Ho la seguente procedura (collegata al relativo pulsante) di aggiornamento dei dati di una tabella, tutto funziona TRANNE NON VIENE ESEGUITO IL VERO AGGIORNAMENTO DEL RECORD DEL DB (OSSIA LA REGISTRAZIONE NON VIENE MODIFICATA NEL DB). COME POSSO FARE PER RENDERLA "VERA" ANCHE NEL DB?

GRAZIE... E BUON VENERDì SERA!

Private Sub btnAggiorna_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAggiorna.Click
Dim intPosition As Integer
Dim objCommand As OleDbCommand = New OleDbCommand
objCommand.Connection = objConnection

'Salvo l'informazione della posizione corrente del record
intPosition = objCurrencyManager.Position

'Imposto il comando di "AGGIORNAMENTO"
objCommand.CommandText = "UPDATE Prescrizione SET Dosaggio_Quantita = @Dosaggio_Quantita, Tempo_Di_Assunzione1 = @Tempo_Di_Assunzione1, Tempo_Di_Assunzione2 = @Tempo_Di_Assunzione2 WHERE Codice_Paziente = @Codice_Paziente AND Descrizione_Farmaco = @Descrizione_Farmaco"

objCommand.Parameters.AddWithValue("@Descrizione_Farmaco", txtFarmaco.Text)
objCommand.Parameters.AddWithValue("@Dosaggio_Quantita", txtDosaggio.Text)
objCommand.Parameters.AddWithValue("@Tempo_Di_Assunzione1", txtVolte.Text)
objCommand.Parameters.AddWithValue("@Tempo_Di_Assunzione2", txtFrequenza.Text)
objCommand.Parameters.AddWithValue("@Codice_Paziente", txtCodicePaziente.Text)

'Devo nuovamente separare il cognome dal nome del paziente
Dim delimitatore As Char = "*"
Dim paz As String
paz = txtPaziente.Text
Dim split(1) As String 'E' un array di 2 elementi di tipo string
split = paz.Split(delimitatore)
objCommand.Parameters.AddWithValue("@Cognome", split(0))
objCommand.Parameters.AddWithValue("@Nome", split(1))



'Apertura connessione
objConnection.Open()

'Esecuzione UPDATE
objCommand.ExecuteNonQuery()

'Chiusura connessione
objConnection.Close()


FillDataSetAndView()


'BindFields()

'Imposto la posizione del record
objCurrencyManager.Position = intPosition

'Mostro la posizione corrente del record
Mostra_Posizione_Record()

MessageBox.Show("Aggiornamento avvenuto con SUCCESSO!", "LET_ME: Visualizzazione/Modifica Prescrizioni Esistenti")
End Sub

alx_81 Profilo | Guru

>Salve a tutti.
Ciao!

>Ho la seguente procedura (collegata al relativo pulsante) di
>aggiornamento dei dati di una tabella, tutto funziona TRANNE
>NON VIENE ESEGUITO IL VERO AGGIORNAMENTO DEL RECORD DEL DB (OSSIA
>LA REGISTRAZIONE NON VIENE MODIFICATA NEL DB). COME POSSO FARE
>PER RENDERLA "VERA" ANCHE NEL DB?
- Sei sicuro che la query da te creata effettivamente trovi il record da modificare?
- Come mai quei due parametri @Cognome e @Nome che non vedo nella update?
- Hai provato a controllare bene in debug i valori e come ti viene quindi prodotta la query di update?
- se hai sql server, prova a controllare con un profiler quello che effettivamente arriva al db..

Alx81 =)

http://blogs.dotnethell.it/suxstellino

172690 Profilo | Junior Member

Ho sistemato la query, c'erano due parametri in più e uno mancava, PERO' IL RECORD NON VIENE AGGIORNATO SULLA BASE DI DATI. Uso access e quando apro la tabella per vedere la modifica, non c'è: ci sono ancora i vecchi valori! Come mai? Stessa cosa se faccio una procedura DELETE, mi individua il record, ma non me lo cancella!
Hai una qualche idea in proposito?!
Grazie ancora e buon sabato

StefanoLep Profilo | Senior Member

Ciao, visto che sembra tutto corretto probabilmente il problema è nella WHERE, infatti le query di Update e Delete non vanno in errore se non trovano il record da modificare/cancellare. Perchè non provi a fare una Select con la stessa clausola WHERE e vedi se ti restituisce un record?
E' la passione che genera il progresso :-)

alx_81 Profilo | Guru

>Ho sistemato la query, c'erano due parametri in più e uno mancava,
>PERO' IL RECORD NON VIENE AGGIORNATO SULLA BASE DI DATI. Uso
>access e quando apro la tabella per vedere la modifica, non c'è:
>ci sono ancora i vecchi valori! Come mai? Stessa cosa se faccio
>una procedura DELETE, mi individua il record, ma non me lo cancella!
>Hai una qualche idea in proposito?!
Come correttamente ti indica anche StefanoLep, è molto probabile che tu generi una WHERE condition che non soddisfa il criterio di ricerca. Di conseguenza non ottieni il record cercato e risulta impossibile modificarlo. Per questo ti chiedevo se hai fatto un debug per capire come viene composta la query di UPDATE.
Prova a fare debug, prendere la stringa che ti viene generata sostituendo i parametri, copiarla ed incollarla su access..
Vedrai che se il problema è quello della WHERE condition, non viene modificato alcun record. In tal caso, cerca di capire dove la condizione sbaglia..
Se la where condition è corretta, copiaincollando la query generata in access ed eseguendola puoi capire meglio ciò che sta succedendo..

>Grazie ancora e buon sabato
Grazie e buona domenica a te, vista l'ora
Alx81 =)

http://blogs.dotnethell.it/suxstellino

172690 Profilo | Junior Member

Allora, ho fatto coem mi avete suggerito.

Questa è la UPDATE:
UPDATE Prescrizione SET Codice_Paziente = @Codice_Paziente, Codice_AIC = @Codice_AIC, Descrizione_Farmaco = @Descrizione_Farmaco, Dosaggio_Quantita = @Dosaggio_Quantita, Dosaggio_Forma_Farmaceutica = @Dosaggio_Forma_Farmaceutica, Tempo_Di_Assunzione1 = @Tempo_Di_Assunzione1, Tempo_Di_Assunzione2 = @Tempo_Di_Assunzione2 WHERE Codice_Paziente = @Codice_Paziente AND Codice_AIC = @Codice_AIC


Ho provato la seguente SELECT dove però la WHERE non l'ho fatta parametrica (non so come si faccia!)
SELECT Codice_Paziente, Codice_AIC, Descrizione_Farmaco, Dosaggio_Quantita, Dosaggio_Forma_Farmaceutica, Tempo_Di_Assunzione1, Tempo_Di_Assunzione2
FROM Prescrizione
WHERE Codice_Paziente = "X" AND Codice_AIC = "008906012";

Con questa query, il record viene individuato... non so più cosa fare...

StefanoLep Profilo | Senior Member

Ciao, la WHERE della Select deve essere identi a quella dell'Update
"WHERE Codice_Paziente = @Codice_Paziente AND Descrizione_Farmaco = @Descrizione_Farmaco"

I parametri di una select si aggiungono nello stesso identico modo che usi nella Update, quindi copia il codice che hai utilizzato per la query di update, modifica la prima parte in una Select, aggiungi al command solo i due parametri della WHERE.
E' la passione che genera il progresso :-)

172690 Profilo | Junior Member

Ho eseguito questa SELECT e funziona: mi restituisce esattamente il record che volevo!

SELECT [Codice_Paziente], [Codice_AIC], [Descrizione_Farmaco], [Dosaggio_Quantita], [Dosaggio_Forma_Farmaceutica], [Tempo_Di_Assunzione1], [Tempo_Di_Assunzione2]
FROM Prescrizione
WHERE Codice_Paziente=[@Codice_Paziente] And Codice_AIC=[@Codice_AIC];

E ora?!

172690 Profilo | Junior Member

Ho eseguito la UPDATE con Access e FUNZIONA CORRETTAMENTE:

UPDATE Prescrizione SET Codice_Paziente = [@Codice_Paziente], Codice_AIC = [@Codice_AIC], Descrizione_Farmaco = [@Descrizione_Farmaco], Dosaggio_Quantita = [@Dosaggio_Quantita], Dosaggio_Forma_Farmaceutica = [@Dosaggio_Forma_Farmaceutica], Tempo_Di_Assunzione1 = [@Tempo_Di_Assunzione1], Tempo_Di_Assunzione2 = [@Tempo_Di_Assunzione2]
WHERE Codice_Paziente=[@Codice_Paziente] And Codice_AIC=[@Codice_AIC];


CHE E' PROPRIO QUELLA NELLA PROCEDURA!
ALLORA PERCHè NELLA PROCEDURA NON ESEGUE LA SCRITTURA "REALE" NELLA BASE DI DATI?!
GRAZIE ANCORA E SCUSATE PER IL DISTURBO!

StefanoLep Profilo | Senior Member

Se imposti la query tutta a mano funziona?

Questa è la tua query:
UPDATE Prescrizione SET Codice_Paziente = [@Codice_Paziente], Codice_AIC = [@Codice_AIC], Descrizione_Farmaco = [@Descrizione_Farmaco], Dosaggio_Quantita = [@Dosaggio_Quantita], Dosaggio_Forma_Farmaceutica = [@Dosaggio_Forma_Farmaceutica], Tempo_Di_Assunzione1 = [@Tempo_Di_Assunzione1], Tempo_Di_Assunzione2 = [@Tempo_Di_Assunzione2]
WHERE Codice_Paziente=[@Codice_Paziente] And Codice_AIC=[@Codice_AIC]

Se imposti questa sotto funziona?

UPDATE Prescrizione SET Descrizione_Farmaco = 'prova', Dosaggio_Quantita = 1, Dosaggio_Forma_Farmaceutica = 1, Tempo_Di_Assunzione1 = 1, Tempo_Di_Assunzione2 = 2
WHERE Codice_Paziente='X' And Codice_AIC='AIC'

cioè togliendo i campi Codice_Paziente e Codice_AIC e impostando i valori rimanenti a mano. Per vedere qualcosa prova a lanciare la query direttamente da access e poi dal tuo programma. Se da access funziona e dal tuo programma no potrebbe essere un problema di permessi o qualcosa che non va nella connessione. Fammi sapere :-)

E' la passione che genera il progresso :-)

172690 Profilo | Junior Member

Ho provato con questa:

UPDATE Prescrizione SET Descrizione_Farmaco = 'prova', Dosaggio_Quantita = 1, Dosaggio_Forma_Farmaceutica = 1, Tempo_Di_Assunzione1 = 1, Tempo_Di_Assunzione2 = 2
WHERE Codice_Paziente='X' And Codice_AIC='008906012'

E' uguale alla tua, ma per ovvi motivi ho dovuto cambiare il codice_aic...
FUNZIONA TUTTO, su access....

E la inserisco nella procedura e diventa così (ti riporto tutto il codice della procedura, FUNZIONA----> COSA FACCIO ALLORA?)

Private Sub btnAggiorna_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAggiorna.Click
Dim intPosition As Integer
Dim objCommand As OleDbCommand = New OleDbCommand
objCommand.Connection = objConnection

'Salvo l'informazione della posizione corrente del record
intPosition = objCurrencyManager.Position

'Imposto il comando di "AGGIORNAMENTO"
'objCommand.CommandText = "UPDATE Prescrizione SET Codice_Paziente = @Codice_Paziente, Codice_AIC = @Codice_AIC, Descrizione_Farmaco = @Descrizione_Farmaco, Dosaggio_Quantita = @Dosaggio_Quantita, Dosaggio_Forma_Farmaceutica = @Dosaggio_Forma_Farmaceutica, Tempo_Di_Assunzione1 = @Tempo_Di_Assunzione1, Tempo_Di_Assunzione2 = @Tempo_Di_Assunzione2 WHERE Codice_Paziente = @Codice_Paziente AND Codice_AIC = @Codice_AIC"

objCommand.CommandText = "UPDATE Prescrizione SET Descrizione_Farmaco = 'prova', Dosaggio_Quantita = 1, Dosaggio_Forma_Farmaceutica = 1, Tempo_Di_Assunzione1 = 1, Tempo_Di_Assunzione2 = 2 WHERE Codice_Paziente='X' And Codice_AIC='008906012'"


'objCommand.Parameters.AddWithValue("@Codice_AIC", txtCodiceAIC.Text)
'objCommand.Parameters.AddWithValue("@Descrizione_Farmaco", txtFarmaco.Text)
'objCommand.Parameters.AddWithValue("@Dosaggio_Quantita", txtDosaggio.Text)
'objCommand.Parameters.AddWithValue("@Dosaggio_Forma_Farmaceutica", txtFormaFarmaceutica.Text)
'objCommand.Parameters.AddWithValue("@Tempo_Di_Assunzione1", txtVolte.Text)
'objCommand.Parameters.AddWithValue("@Tempo_Di_Assunzione2", txtFrequenza.Text)
'objCommand.Parameters.AddWithValue("@Codice_Paziente", txtCodicePaziente.Text)

'Devo nuovamente separare il cognome dal nome del paziente
'Lo tolgo perchè nella tabella "Prescrizione" il Cognome e il Nome non ci sono

'Dim delimitatore As Char = "*"
'Dim paz As String
'paz = txtPaziente.Text
'Dim split(1) As String 'E' un array di 2 elementi di tipo string
'split = paz.Split(delimitatore)
'objCommand.Parameters.AddWithValue("@Cognome", split(0))
'objCommand.Parameters.AddWithValue("@Nome", split(1))

MessageBox.Show("Il nuovo record è")
MessageBox.Show("Codice Paziente " & txtCodicePaziente.Text)
'MessageBox.Show("Cognome" & split(0))
'MessageBox.Show("Nome" & split(1))
MessageBox.Show("Farmaco" & txtFarmaco.Text)
MessageBox.Show("Dose" & txtDosaggio.Text)
MessageBox.Show("Forma" & txtFormaFarmaceutica.Text)
MessageBox.Show("Volte" & txtVolte.Text)
MessageBox.Show("Frequenza" & txtFrequenza.Text)

'Apertura connessione
objConnection.Open()

MessageBox.Show("Apro la connessione e Dose" & txtDosaggio.Text)

'Esecuzione UPDATE
MessageBox.Show("Prima della query e Dose" & txtDosaggio.Text)
objCommand.ExecuteNonQuery()
MessageBox.Show("Dopo la query e Dose" & txtDosaggio.Text)
'Chiusura connessione
objConnection.Close()
MessageBox.Show("Chiudo connessione e Dose" & txtDosaggio.Text)

'Si richiamano le procedure "FillDataSetAndView" e "BindFields" per ricaricare
'l'oggetto DataView ed eliminare ed eseguire il rebinding dei controlli; in questo
'modo si garantisce che tutti i nuovi dati vengono aggiornati o cancellati

FillDataSetAndView()

MessageBox.Show("Dopo Richiamo Fill e prima del richiamo BindFields e Dose" & txtDosaggio.Text)

'BindFields()
MessageBox.Show("Dopo Richiamo Bind Dose" & txtDosaggio.Text)

'Imposto la posizione del record
objCurrencyManager.Position = intPosition

'Mostro la posizione corrente del record
Mostra_Posizione_Record()

MessageBox.Show("Aggiornamento avvenuto con SUCCESSO!", "LET_ME: Visualizzazione/Modifica Prescrizioni Esistenti")
End Sub

StefanoLep Profilo | Senior Member

Vuoi vedere che il problema è il codice AIC... nel senso che probabilmente quando gli passi questo codice probabilmente viene convertito in un numero per cui tu credi di passare '008906012' ma in realtà stai passando 8906012, quando esegui la query in debug controlla il valore del parametro @Codice_AIC per verificarne il valore.
E' la passione che genera il progresso :-)

172690 Profilo | Junior Member

No, è una stringa... Provato... e poi @Codice_AIC prende il valore da txtCodiceAIC.Text, che è per forza una stringa...
E' due giorni che ci giro intorno.... prima modificava tutto... mi ero dimenticato di inserire nella WHERE la condizione sul codiceAIC, quindi cambiava tutti i parametri a tutte le registrazioni di X, poi quando ho inserito la condizione (che prima era sulla Descrizione_Farmaco, ma anche allora non modificava più) non scrive più nella bese di dati.
Altre idee?
Stessa cosa accade nella DELETE, non cancella...

Ti posto qui sotto anche quella:

Private Sub btnCancella_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancella.Click
Dim intPosition As Integer
Dim objCommand As OleDbCommand = New OleDbCommand
objCommand.Connection = objConnection

intPosition = Me.BindingContext(objDataView).Position - 1

If intPosition < 0 Then
intPosition = 0
End If

'Impostazione comando di cancellazione
objCommand.CommandText = "DELETE FROM Prescrizione WHERE Codice_Paziente = @Codice_Paziente AND Descrizione_Farmaco = @Descrizione_Farmaco"
objCommand.Parameters.AddWithValue("@Descrizione_Farmaco", BindingContext(objDataView).Current("Descrizione_Farmaco"))
objCommand.Parameters.AddWithValue("@Codice_Paziente", txtPaziente.Text)
'Apertura connessione
objConnection.Open()

'Esecuzione del comando
objCommand.ExecuteNonQuery()

'Chiusura connessione
objConnection.Close()

'Si richiamano le procedure "FillDataSetAndView" e "BindFields" per ricaricare
'l'oggetto DataView ed eliminare ed eseguire il rebinding dei controlli; in questo
'modo si garantisce che tutti i nuovi dati vengono aggiornati o cancellati (e anche
'eventualmente aggiunti ---> in questo caso NON si aggiungono)
FillDataSetAndView()
BindFields()

'Imposto la posizione del record
Me.BindingContext(objDataView).Position = intPosition

'Mostro la posizione
Mostra_Posizione_Record()

MessageBox.Show("Cancellazione avvenuta con SUCCESSO!", "LET_ME: Visualizzazione/Modifica Prescrizioni Esistenti")

End Sub


GRAZIE E SCUSAMI... MA è SOLO 1 MESE CHE PROGRAMMO IN VBNET, E LA GESTIONE/MANIPOLAZIONE DEI DB MI RIESCE UN PO' COSI'.... :-(
MA STO FACENDO TESORO DI TUTTO QUELLO CHE MI DITE...

StefanoLep Profilo | Senior Member

Ciao, un'altra prova modifica questa parte di codice:

objCommand.CommandText = "DELETE FROM Prescrizione WHERE Codice_Paziente = @Codice_Paziente AND Descrizione_Farmaco = @Descrizione_Farmaco"
objCommand.Parameters.AddWithValue("@Descrizione_Farmaco", BindingContext(objDataView).Current("Descrizione_Farmaco"))
objCommand.Parameters.AddWithValue("@Codice_Paziente", txtPaziente.Text)

in questo modo:
objCommand.CommandText = "DELETE FROM Prescrizione WHERE Codice_Paziente = @Codice_Paziente AND Descrizione_Farmaco = @Descrizione_Farmaco"
objCommand.Parameters.AddWithValue("@Codice_Paziente", txtPaziente.Text)
objCommand.Parameters.AddWithValue("@Descrizione_Farmaco", BindingContext(objDataView).Current("Descrizione_Farmaco"))

In pratica ho solo invertito l'ordine dei parametri perchè riguardando il tuo post iniziale mi sono accorto che usi OleDbCommand e non SqlCommand (io uso sempre questo perchè lavoro su SqlServer) e mi sembra che il provider OleDb gestisca i parametri in maniera POSIZIONALE. Se la soluzione non è nemmeno questa dimmi che db usi e la connectionString che provo a fare una prova in locale :-)

E' la passione che genera il progresso :-)

172690 Profilo | Junior Member

Purtropp non è nemmeno questa!
Non penso che la stringa di connessione sia sbagliata, perchè faccio altre query e quello funzionano...
comunque uso access e la string è: "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\...;User id=admin;Password=;"

Altre idee per la Aggiorna?!?!
Non so più che pesci prendere...
Grazie...
Mi sa che per stasera vado a letto...

GRAZIE ANCORA

StefanoLep Profilo | Senior Member

Il tuo problema mi ha incuriosito non poco e così mi sono creato una tabella in access con tre campi per snellire un pò il problema: la soluzione è che i parametri in OleDb sono strettamente POSIZIONALI, questa query che ti allego funziona ma se inverti l'ordine dei paramtri non funge più...

objCommand.CommandText = "UPDATE Prescrizione SET Descrizione_Farmaco = @Descrizione_Farmaco WHERE Codice_Paziente = @Codice_Paziente AND Codice_AIC = @Codice_AIC"

objCommand.Parameters.AddWithValue("@Descrizione_Farmaco", txtDesFarmaco.Text)
objCommand.Parameters.AddWithValue("@Codice_Paziente", txtCodPaz.Text)
objCommand.Parameters.AddWithValue("@Codice_AIC", txtAic.Text)

objCommand.CommandType = CommandType.Text
objCommand.ExecuteNonQuery()
objCommand.Parameters.Clear() 'questo è importante richiamarlo sempre dopo aver eseguito una query con parametri

Ciao, alla prossima



E' la passione che genera il progresso :-)

172690 Profilo | Junior Member

Wow!
Funziona!!! Ti ringrazio....
Ho provato a vedere l'ordine per la "cancella", ma quello va bene, ma la funzione non va!
Altre idee!?!?!?
SCUSAMI PER IL DISTURBO...
GRAZIE 1.000 PER AVERMI RISOLTO IL PROBLEMA!

StefanoLep Profilo | Senior Member

Hai messo questo ? objCommand.Parameters.Clear()
Altrimenti i parametri utilizzati dal command restano in memoria e le query successive non funzioneranno.
Se accetti la risposta chiudiamo anche il thread :-)
E' la passione che genera il progresso :-)

172690 Profilo | Junior Member

Messo tutto, ho provato anche a cambiare e metterci il Codice_Aic invece della descrizione, ma non funziona

StefanoLep Profilo | Senior Member

Cerco di dargli uno sguardo stasera perchè ora sto in ufficio e non ho il progetto di prova che ho usato ieri per replicare il problema.
E' la passione che genera il progresso :-)

172690 Profilo | Junior Member

HO RISOLTO DA ME PER LA CANCELLA...
GRAZIE DEL PREZIOSISSIMO AIUTO!
BUON LAVORO E BUON PROSEGUIMENTO DI GIORNATA!

StefanoLep Profilo | Senior Member

Grazie a te per la risposta accettata, ma cosa c'era nella Delete che non andava?
E' la passione che genera il progresso :-)

172690 Profilo | Junior Member

un errore di un campo, passavo la textbox sbagliata...
a presto... e ancora GRAZIE
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