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
Aggiornamento da Datagridview
venerdì 23 gennaio 2009 - 16.50
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
cisco7940
Profilo
| Newbie
8
messaggi | Data Invio:
ven 23 gen 2009 - 16:50
Buongiorno, riempio un Datagridview da DB Access , modifico i dati nel datagridview , al momento di salvare nel DB mi da un messaggio :
"Violazione di concorrenza: UpdateCommand ha modificato 0 dei 1 record previsti."
Devo dire che prima di salvare i dati (Button5_Click), con un botton (Button4_Click) rielaboro la tabella del db con un coefficente di incremento o decremento andando a fare un delete e un sucessivo update alla tabella del db , i cambiamenti li vedo correttamente sul Datagridview ad ogni rielaborazione ma al momento dell'update (Button5_Click) ecco l'errore.
Tabella DB ReportArt chiave,ArticoloS,DescrizioneS,QtaS,ValMedio
Public Class Inizio
Dim da As New OleDb.OleDbDataAdapter
Dim cmdBld As New OleDb.OleDbCommandBuilder(da)
Dim ds As New DataSet
Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data " _
& "Source=C:\Protocolli\Protocolli.mdb;User Id=admin;Password=;")
Dim cmd As OleDbCommand = New OleDbCommand()
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim cn As ADODB.Connection, rs As ADODB.Recordset
cn = New ADODB.Connection
rs = New ADODB.Recordset
cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data " _
& "Source=C:\Protocolli\Protocolli.mdb;User Id=admin;Password=;")
cn.Execute("DELETE * FROM ReportArt")
cn.Execute("Insert into ReportArt SELECT CodiceArticolo AS ArticoloS, SUM(Qta) AS QtaS , SUM(parzialeNew) AS ValoreTot " & _
"FROM ReportissimoTest GROUP BY CodiceArticolo")
cn.Execute("UPDATE ReportArt SET ReportArt.ValMedio = ReportArt.ValoreTot * ='" & Label15.Text & "'")
riempidg()
End sub
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
da.Update(ds.Tables("ReportArt"))
DataGridView1.Update()
MsgBox("Update avvenuto con successo")
DataGridView1.Refresh()
End sub
Public Sub riempidg()
cmd.Connection = con
cmd.CommandText = "SELECT * FROM ReportArt"
da.SelectCommand = cmd
cmdBld.DataAdapter = da
ds.Clear()
da.DeleteCommand = cmdBld.GetDeleteCommand
da.InsertCommand = cmdBld.GetInsertCommand
da.UpdateCommand = cmdBld.GetUpdateCommand
da.FillSchema(ds, SchemaType.Source)
da.Fill(ds, "ReportArt")
DataGridView1.DataSource = ds.Tables("ReportArt")
End Sub
Jeremy
Profilo
| Guru
1.527
messaggi | Data Invio:
ven 23 gen 2009 - 18:25
A parte il fatto che spero tu non stia tentando di salvare anche un valore di un campo che nella tabella è definito tipo contatore....ma forse ho capito male io..
L'errore che ricevi,....lo ricevi perchè fai cn.Execute per tre volte consecutive.....secondo me.
Risolvi tutto, sicuramente, con una transazione, durante il quale verifichi che non vengano sollevate eccezioni per cui al termine della transazione sia necessario un RollBack....altrimenti esegui il Commit.
Dim objCmd as new OleDb.OledbCommand
Dim ta As OleDb.OleDbTransaction = Conn.BeginTransaction
Dim par() As OleDb.OleDbParameter
objCmd.Connection = Conn
objCmd.Transaction = ta
All'interno di un ciclo for next esegui tutte e tre le istruzioni Sql
dim Query as list( of string) Lista delle tue SqlString
try
for each _query in Query
objcmd.commandtext=_query
objcmd.executenonquery
next
catch ex as exception
ta.rollback
exit sub
endtry
ta.commit
L'ho scritto a memoria...fammi sapere se ci sono errori...
Ciao...
cisco7940
Profilo
| Newbie
8
messaggi | Data Invio:
ven 23 gen 2009 - 18:56
Grazie per la celerità , scusa la presunzione ma purtroppo l'errore mi viene sulla riga "da.Update(ds.Tables("ReportArt"))" , hai ragione di creare il ciclo per gli execute ,ma non credo centri molto , inoltre sicuramente sto sbagliando in quanto è vero che il primo campo chiave e un contatore e quando faccio l'update del dataadapter tento di aggiornare anche lui , ma come dovrei fare la tabella lo contiene ed inoltre se nella select lo escludessi mi direbbe "Generazione SQL dinamica per DeleteCommand non supportata per un SelectCommand che non restituisce informazioni di colonne chiave." sulla riga da.UpdateCommand = cmdBld.GetUpdateCommand.
Spero di non aver fatto confusione , grazie
Jeremy
Profilo
| Guru
1.527
messaggi | Data Invio:
ven 23 gen 2009 - 19:04
Probabilmente ho travisato.....
Se guardi bene, però....usi due connessioni allo stesso Db, senza chiudere la prima che hai usato
>cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data " _
>& "Source=C:\Protocolli\Protocolli.mdb;User Id=admin;Password=;")
Non vedo cn.close
quindi quando fai da.Update(ds.Tables("ReportArt"))" che fa riferimento alla connessione di cmd,quindi conn
>Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data " _
>& "Source=C:\Protocolli\Protocolli.mdb;User Id=admin;Password=;")
ti restituisce una eccezione di concorrenza....perchè due connessioni diverse stanno tentando di accedere allo stesso Db....
Facci sapere
Ciao.
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 !