[VS2005] Salva Modifiche Datagrid nel Database

venerdì 19 settembre 2008 - 11.44

gdlcore Profilo | Junior Member

Ciao a tutti, ho un problema. Ho un DatagridView in un form.
Questo Datagrid mi fa visualizzare degli elementi di un database, io vorrei riuscire a modificarli e poi salvarli senza fare uso del binding navigator.
Io creo un bottone 'Salva', al momento che schiaccio mi salva il database coi nuovi dati, aiutatemi ..ditemi cosa devo inserire nel codice, qualche insert into? Per favore aspetto vostra risposta..

secks Profilo | Senior Member


Ciao, io di solito faccio così:
recupero i dati dalla DataGrid il cui DataSource sia una tabella
Dim t as DatatTable = ctype(datagrid1.Datasource, DataTable)

scorro tutte le righe della DataTable

for each y as datarow in t.rows

Per ogni row controllo se esiste già il record:
Dim s as String = "SELECT * FROM Tabella WHERE tab_cod = 'Pippo'"

Se esiste faccio un UPDATE altrimenti INSERT con SQL

next

Spero di aver indovinato la soluzione in quanto la tua domanda è un po' generica.

Ciao.
Paolo.

gdlcore Profilo | Junior Member

Ciao prima di tutto grazie della risposta, lunedi mattina a lavoro provo la tua soluzione, spero che sia quella giusta, poi ti accetto la risposta! Ci sent lunedi! Ciao grazie ancora!

gdlcore Profilo | Junior Member

Ciao, grazie ancora della risposta..ma non riesco a capire come fare con il codice..prova a dare un occhiata al codice che ho ora, guarda se riesci a capirci qualcosa per favore, grazie:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

L'errore me lo dà schiacciando il tasto salva del binding, e non mi va l'update.
Per questo avevo pensato di non usare il binding che non mi funziona.
La tua soluzione mi sembra l'alternativa migliore ma nn so come inserirla nel codice, la insert into non mi servirebbe adesso che ci penso perchè tramite il datagrid non devo avere la possibilità di aggiungere un record ma solo di modificarlo, quindi dovrei fare solo l'update, spero di essermi spiegato al meglio, ora aspetto tua risposta..grazie ancora, ciao!

secks Profilo | Senior Member

Purtroppo non sono molto afferrato con il databinding.
Dovresti vedere gli esempi che sono in rete.
Per quanto ne so dovresti caricare nel databinding tutti i campi e fare l'update su dataset se alimenenti la grid con il dataset altrimenti con il datatable se la alimenti con datatable.

Tornando al mio esempio l'aggiornamento dei dati viene fatto alla fine, quando esci la form, oppure alla selezione di un button ... ti passi tutti i record e su quelli modificati fai l'update di sql.

Spero di essere stato utile.
Ciao.
Paolo.

gdlcore Profilo | Junior Member

Ecco io vorrei usare il tuo esempio ma non ho capito che codice devo mettere, ora ho l'evento SalvaButton_Click, devo fare il for? Mi puoi aiutare per quanto riguarda il codice da inserire?
Mi hai accennato qualcosa nella prima risposta ma non riesco a capire cosa inserire..
Aspetto tua risposta, grazie mille!

secks Profilo | Senior Member

Mi dovresti dare il codice di come hai caricato il datasource della DataGrid, così posso capire come consigliarti.

Ciao.
Paolo.

gdlcore Profilo | Junior Member

Allora, ora ho fatto una cosa intelligente, ho tolto il binding navigator, ora ho caricato il db normalmente dentro al datagrid in questa maniera:

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

Ok in questo modo carico la tabella Carrello dentro al Datagridview. Ora riesco a vedere cosa ho dentro il carrello. Come vedi però ho la possibilità di modificare le colonne tranne la prima che l'ho messa ReadOnly = True. Poi ho creato un Tasto Salva, che come vedi nel codice è ancora sprovvisto di codice.
Quindi come dicevi nelle altre risposte dovremo fare in modo che al momento della pressione del tasto salva dobbiamo prendere il contenuto del datagrid e piazzarlo nel db, come facciamo? Aspetto tua risposta, dai che quasi ci siamo, grazie mille!

secks Profilo | Senior Member

Ciao, io di solito faccio così:
recupero i dati dalla DataGrid il cui DataSource sia una tabella

Dim t as DatatTable = ctype(CarrelloDataGridView.Datasource, DataTable)

-- La suddetta istruzione è di VB.2003 x il DataGrid ma funziona anche con 2005 con la DataGridView ( lo fatta in C#, se hai problemi fammi sapere. )

---scorro tutte le righe della DataTable

for each y as datarow in t.rows

--Per ogni row controllo se esiste già il record:

Dim s as String = "SELECT * FROM Carrello WHERE CampoChiave = " + y("CampoChiave")

-- Faccio l'estrazione dal db DbOggetti.Mdb come x il caricamento della griglia e mi carico una tabellina di appoggio es. CarrelloTmp

if carrelloTmp.row.count > 0 then
-- se trovato aggiorno con un UPDATE di SQL
else
-- altrimenti INSERT INTO di SQL

endif

next

-- Ci possono fare delle varianti, ma intanto fammi sapere se ok.

Ciao.
Paolo.

gdlcore Profilo | Junior Member

Sto provando in tutti i modi ma non riesco a far nulla..poi nn so come neanche come fare l'update, mi sto diperando..dai un occhiata per favore:

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

La chiave primaria alla tabella carrelo non ce l'avevo, l'ho aggiunta, ho messo nel database che è di tipo contatore è esatto?

secks Profilo | Senior Member

>La chiave primaria alla tabella carrelo non ce l'avevo, l'ho
>aggiunta, ho messo nel database che è di tipo contatore è esatto?

Puoi mettere qualsiasi campo, basta che sia univoco.


Private Sub SalvaGrid_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalvaGrid.Click
Dim t As DataTable = CType(CarrelloDataGridView.DataSource, DataTable)
Dim carrellotmp As DataTable
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\DbOggetti.mdb"
For Each y As DataRow In t.Rows

Dim s As String = "SELECT * FROM Carrello WHERE ID = " + trim(str( y("ID")))
Dim adattatore As New OleDb.OleDbDataAdapter(s, strConn)

'adattatore.Fill(carrellotmp)

-- Farei aggiungerei così:

dim ds as new DataSet
adattatore.Fill(ds,"Pippo")

dim t2 as DataTable = ds.Tables("Pippo")

If t2.Rows.Count > 0 Then

s = "UPDATE Carrello SET campo1='" + y("Campo1") +"' campo2 = '" + y("campo2") + "' WHERE ID = " + trim(str( y("ID") ))

else

s = "INSERT INTO Carrello(campo1,campo2,campo3,ID) VALUES ('" + y("campo1") +"','"+y("campo2")+"','" + y("campo3") +"', trim(str(y("ID")))

End If

--- istruzione per eseguire

dim cn as OleDbConnection = New OleDbConnection(strConn)
dim cm as OleDbCommand = new OleDbCommand(s,cn)

try
cm.ExecuteNonQuery()
catch ex as Exception
MsgBox("Errore:" + ex.Message )
end try


Next
End Sub

Ciao.
Paolo.

gdlcore Profilo | Junior Member

Grazie per la risposta,lunedi torno a lavoro e ti faccio sapere se sono riuscito!
Tieni d'occhio il post grazie per la pazienza!!

Ciao buon weekend!

gdlcore Profilo | Junior Member

Ciao, credo che quasi ci siamo..però ho un errore ancora, questo è il codice:

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

Avvio l'applicazione, modifico la quantità dell'oggetto e premo il tasto "Salva", mi esce fuori questo msgbox con questo:

Errore: ExecuteNonQuery richiede una oggetto Connection aperto e disponibile. Lo stato attuale della connessione è chiuso.

Non capisco quale connessione aprire..aspetto tua risposta, grazie..secondo me manca poco..

gdlcore Profilo | Junior Member

Ok sono riuscito a risolvere in qualche maniera..ho eliminato qualcosa,per ora va bene, fa quello che volevo, se ho qualch problema ti scrivo ancora! Grazie mille! Questo è il codice, dagli un occchiata, dimmi pure se vedi qualcosa che non va, ora ti accetto la risposta!!Ciao!!

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

secks Profilo | Senior Member

Siccome devi solo aggiornare condizionerei le azioni solo se record trovato:

If t2.Rows.Count > 0 Then
Using Connl As New OleDb.OleDbConnection(strConn)
Connl.Open()
s = "UPDATE Carrello SET Quantita='" + y("Quantita") + "' WHERE ID = " + Trim(Str(y("ID")))
Dim cmdModArt As New OleDb.OleDbCommand(s, Connl)
cmdModArt.ExecuteNonQuery()
Connl.Close()
End Using
End If

Ciao.
Paolo

gdlcore Profilo | Junior Member

Ok tutto a posto, però ora ho qualche problemino..
In pratica se seleziono la riga la posso cancellare, ma non voglio che si possa fare questa operazione.
Poi un altro problemino: se io inserisco un prodotto nel carrello, e in un altro momento lo inserisco un altra volta, avrò due righe uguali, invece vorrei fare in modo che se c'è un prodotto con descrizione uguale incrementi di 1 la quantità..che dici si può fare? Grazie!

secks Profilo | Senior Member

>Ok tutto a posto, però ora ho qualche problemino..
>In pratica se seleziono la riga la posso cancellare, ma non voglio
>che si possa fare questa operazione.

prova a guardare la proprietà DefaulView.AllowDelete della DatatTable (mettila a false).

>Poi un altro problemino: se io inserisco un prodotto nel carrello,
>e in un altro momento lo inserisco un altra volta, avrò due righe
>uguali, invece vorrei fare in modo che se c'è un prodotto con
>descrizione uguale incrementi di 1 la quantità..che dici si può
>fare? Grazie!

prova a guardare la proprietà Select della DatatTable, ti permette di vedere se c'è già il record.

Ciao.
Paolo.

gdlcore Profilo | Junior Member

Non sono riuscito a fare nessuna delle due operazioni..non c'è quella proprietà al datagrid, invece nn so qual'è il datatable per vedere se quello ha quelle proprietà..
Ora apro un altro post per un altro problema sempre con il carrello, nn lo posto qui altrimenti andiamo fuori argomento, se vuoi aiutarmi anche per quello! Grazie di tutto!

secks Profilo | Senior Member

1 -Tabella.DefaultView.AllowDelete = False

Dovrei vedere come carichi i dati nella DataGridView per spiegarti meglio.

2 - Prima di inserire il prodotto nel carrello verichi se esiste già:

come hai già visto

Dim t As DataTable = CType(CarrelloDataGridView.DataSource, DataTable)

dim j() as DataRow = t.select("CodiceProdotto='" + ProdottoNuovo + "'")

if j.lenght = 0 then
... inserisci
else
messaggio "prodotto già esistente!"
endif


Ciao.
Paolo.
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