Aggiornamento da Datagridview

venerdì 23 gennaio 2009 - 16.50

cisco7940 Profilo | Newbie

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

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

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

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.


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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5