Newsgroup: it.comp.lang.visual-basic
Titolo: Aggiornare DataGridView

Ciao,
Non riesco ad aggiornare una tabella collegata a Sql server (VB 2005)
 
Per la connessione uso ODBC legata ad un file dsn:
 
Dim dbConn As New OdbcConnection("FILEDSN=C:\Programmi\File comuni\ODBC\Data Sources\Biglia.dsn;Uid=access;Pwd=accessdb")
Dim dbComm As New OdbcCommand
Dim dbAdapter As OdbcDataAdapter
Dim ds As DataSet
 
Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        Try
            dbConn.Open()
            dbComm.Connection = dbConn
 
        Catch ex As Exception
            MsgBox("Non riesco a connettermi :-(", MsgBoxStyle.Information + vbOKOnly, "Connessione")
        End Try
 
    End Sub
 
Così popolo la datagrid:
 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        dbAdapter = New OdbcDataAdapter("Select * from T_Richiedente", dbConn)
 
        Try
 
            ds = New DataSet
            dbAdapter.Fill(ds, "T_Richiedente")
            dgvTest.DataSource = ds.Tables("T_Richiedente")
 
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical + vbOKOnly, "Connessione")
        End Try
 
    End Sub
 
ora, nel datagrid una colonna è un campo bit checkbox che vado a spuntare in alcune righe. Fatto ciò come faccio ad aggiornare la tabella dopo aver spuntato le celle?
grazie

 Ciao,
 
dataadapter.update
 
però bisogna che esista una query di aggiornamento!!!
puoi farla generare dal commandbuilder....
 
insomma il discorso è un po lungo e richiede un po più di studio!
 
ti consiglio
http://punto-informatico.it/PILibri/Dettaglio.aspx?id=214
 
è gratis...è in italiano....
 
unico difetto...usa esempi in C# ma sono talmente banali....
e poi un programmer .net deve capirne di ambedue !!!
 


Avevo provato così ma non funziona..
 
Pulsante Aggiorna_Click
 
 
Dim cmdBuilder As New Odbc.OdbcCommandBuilder(dbAdapter)
        Dim i As Integer
 
        Try
 
        i = dbAdapter.Update(ds, "T_Richiedente")
 
        Catch ex As Exception
        MsgBox(ex.Message)
        End Try
 
End sub

Il giorno lunedì 3 settembre 2012 15:10:44 UTC+2, wodka40[LinuxMint] ha scritto:

Dimenticavo la query...
 
Dim dbAdapterUpdate As OdbcDataAdapter
 
Pulsante_Click
 
 
dbAdapterUpdate = New Odbc.OdbcDataAdapter("Update T_Richiedente SET Visto = '" & dgvTest.CurrentRow.Index & "')", dbConn)
 
 
        Dim cmdBuilder As New Odbc.OdbcCommandBuilder(dbAdapterUpdate)
        Dim i As Integer
 
        Try
 
            i = dbAdapterUpdate.Update(ds, "T_Richiedente")
 
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
 
Ma non va lo stesso....

>
abbi pazienza...cerca di capirmi...non è indisponibilità!
Capirai quindi che non mi sento in vena di fornire 2 righe di codice già 
pronto e che non ti risolverà nulla se non aumentarti la confusione!!!
 
E' stato scritto milardi di volte e ci sono quintali di doc....
 
Il dataAdapter(DA) è solo un contenitore
 
cosa contiene ? COMMANDS
uno per il select
uno per l'update
uno per il delete
uno per il cancel
 
DEVONO ....devono esistere...altrimenti non aggiorni nulla!
 
Per esistere devono essere generati!
 
Quindi....la omanda sorge spontanea....
cosa è un command?
un oggetto che ha (ridotto all'osso)
UNA CONNESSIONE
UNA QUERY SQL
 
il command non fa altro quando invocato che :
1) APRIRE LA CONNESSIONE
2) INVIARE IL TESTO DELLA QUERY SQL
3) FORNIRE AGGANCI per gestire la risposta...che NON gestisce il command 
ma un eventuale READER!
 
 
Quindi è un sistema di scatole cinesi
 
CONNESSIONE
----> COMMAND
------->READER
--------->DATASET/DATATABLE
 
il dataadapter ti incapsula connection e command per darti un solo 
"coso" di interfaccia!
 
Il problema è che non è detto sempre crei le corrispondenti query!
La creazione guidata di visual studio...quando agganci un 
database...arriva ad un punto che ti CHIEDE ESPLICITAMENTE se vuoi crare 
le query di aggiornamento etc etc....
 
SE LO FAI da codice....agganci al dataadapter una connessione....ti crea 
solo la SELECT
 
ed il resto?
il resto ti attacchi al tram
 
devi crearla a mano la query e assegnarla alla corrispondente voce....
 
oppure....esiste un oggetto....commandbuilder che ci pensa lui DATA una 
connessione ed una tabella a fare le query PARAMETRICHE di update delete 
etc etc....
 
 
 
OGNI ULTERIORE INFO....la trovi studiando provando e spulciando il 
web......il libro linkato ha tutte le info che ti servono!
 
 
CIAO!
 

 Ma non va lo stesso....
eh  beh! può darsi....controlla che ci siano le query di update!
che la tabella esista
che il datadapter sia creato
 
e sopratutto LEGGI l'errore....che dice?
 


UNA COSA
ad esempio
chi az ti ha detto di mettere il try catch?????
perchè lo hai fatto?
TOGLILO SUBITO
quando riuscirai a dare una risposta convincente lo rimetterai!

 On 03/09/2012 16:01, wodka40[LinuxMint] wrote:
 
 
 
una generazione di programmatori rovinati dal try catch!!!!!!


Try Catch in realtà era commentato..
è da venerdì che giro sul web per questa cosa e non trovando nulla ho deciso di scrivere qui per vedere un esempio di codice, tutto qui!

 è da venerdì che giro sul web per questa cosa e non trovando nulla ho deciso di scrivere qui per vedere un esempio di codice, tutto qui!
Nel post non ci sono commenti!
...cmq.....
Testo errore?????
 

 Il giorno lunedì 3 settembre 2012 16:03:16 UTC+2, wodka40[LinuxMint] ha scritto:
 
.....
altra cosa perchè ODBC????
 
 

On 03/09/2012 15:54, Marco75 wrote:
zac
 
http://www.visual-basic.it/articoli/acAdoNet.htm
 
 
una cosa che assomiglia a (cito)
.........................
  ' Generazione automatica dei comandi SQL.
  ' I comandi vengono generati sulla base di quanto contenuto nella 
SelectCommand
  ' che in questo caso deve essere obbligatoria.
 
  ' E' necessario specificare il DataAdapter di cui generare i comandi SQL
  Dim cmdBuild As New OleDbCommandBuilder(da)
 
  ' Assegniamo i comandi generati al nostro DataAdapter
  da.UpdateCommand = cmdBuild.GetUpdateCommand()
  da.DeleteCommand = cmdBuild.GetDeleteCommand()
...............................
 
non la vedo nel tuo codice!...può darsi che ci sia...ma non l'hai postata!


Ora ho una riunione comunque velocemente..
ODBC lo uso perchè parto da un file DSN di origine dati. Avevo creato l'origine da pannello di controllo poi sono riuscito ad accedere al file saltando quella parte..
per il resto:
la form si chiama Connetti
Button1 carica il datagridview
Button2 aggiunge un record alla tabella mettendo quanto scritto in TextBox
Button3 è quanto vorrei fare:
 
nel datagrid ho ID, Richiedente, Visto (Dove visto è una checkbox)
 
voglio spuntare le caselle (1 o più) del campo Visto e ovviamente deve salvare la spunta. 
Spuntando la casella parte una mail e fa altre 2 cosette, sono fermo al fatto di salvare la tabella.
Metto tutto il codice del form fatto fino ad ora:
 
Imports System.Data.Odbc
Imports System.Data
 
Public Class Connetti
    Dim dbConn As New OdbcConnection("FILEDSN=C:\Programmi\File comuni\ODBC\Data Sources\Biglia.dsn;Uid=access;Pwd=accessdb")
    Dim dbComm As New OdbcCommand
    Dim dbAdapter As OdbcDataAdapter
    Dim ds As DataSet
 
    Private Sub Connetti_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        Try
            dbConn.Open()
            dbComm.Connection = dbConn
 
        Catch ex As Exception
            MsgBox("Non riesco a connettermi :-(", MsgBoxStyle.Information + vbOKOnly, "Connessione")
        End Try
 
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        dbAdapter = New OdbcDataAdapter("Select * from T_Richiedente", dbConn)
 
        Try
 
            ds = New DataSet
            dbAdapter.Fill(ds, "T_Richiedente")
            dgvTest.DataSource = ds.Tables("T_Richiedente")
 
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical + vbOKOnly, "Connessione")
        End Try
 
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
 
        'Se è una TextBox...
        Dim cmd As New Odbc.OdbcCommand("Insert into T_Richiedente (Richiedente) values ('" & TextBox1.Text & "')", dbConn)
        cmd.Parameters.Add("@Richiedente", OdbcType.NVarChar, 50, "Richiedente").Value = TextBox1.Text
        cmd.ExecuteNonQuery()
 
    End Sub
 
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
 
        'Dim cmdBuilder As New Odbc.OdbcCommandBuilder(dbAdapter)
        'dbAdapter.UpdateCommand = cmdBuilder.GetUpdateCommand()
 
        'Dim i As Integer
 
        'Try
 
        'i = dbAdapter.Update(ds, "T_Richiedente")
 
        'Catch ex As Exception
        'MsgBox(ex.Message)
        'End Try
 
    End Sub


Ho guardato il tuo link e ho provato così:
 
 
Dim cmdBuild As New OdbcCommandBuilder(dbAdapter)
        dbAdapter.UpdateCommand = cmdBuild.GetUpdateCommand()
 
        Dim sql As String
 
        sql = "Insert into T_Richiedente (ID,Richiedente,Visto) values (@ID,@Richiedente,@Visto)"
 
        Dim cmd As New OdbcCommand(sql, dbConn)
 
        dbAdapter.InsertCommand = cmd
        dbAdapter.InsertCommand.Parameters.Add("@ID", OdbcType.Int, 10, "ID")
        dbAdapter.InsertCommand.Parameters.Add("@Richiedente", OdbcType.NVarChar, 50, "Richiedente")
        dbAdapter.InsertCommand.Parameters.Add("@Visto", OdbcType.Bit, 1, "Visto")
        dbAdapter.Update(ds, "T_Richiedente")
 
ma va in errore su dbAdapter.UpdateCommand = cmdBuild.GetUpdateCommand():
 
Generazione SQL dinamica per UpdateCommand non supportata per un SelectCommand che non restituisce informazioni di colonne chiave.
 
La colonna chiave è ID...
 


Risolto!! mancava la chiave primaria (ero convinto di averla assegnata)..
Il codice di modifica dati è ora questo, ho inserito nella form anche delle textbox e Checkbox di appoggio:
 
 
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
 
 
        Dim mem As Integer
        Dim mem2 As String
        Dim mem3 As String
 
        mem = dgvTest.Rows(dgvTest.CurrentRow.Index).Cells("ID").Value
        mem2 = dgvTest.Rows(dgvTest.CurrentRow.Index).Cells("Richiedente").Value
        mem3 = dgvTest.Rows(dgvTest.CurrentRow.Index).Cells("Visto").Value.ToString
        Me.Refresh()
 
        tbA.Text = mem
        tbB.Text = mem2
        If mem3 = "" Or mem3.ToString = "False" Then
            cbX.Checked = False
        Else
            cbX.Checked = True
        End If
 
        'Dim dbAdapter2 As OdbcDataAdapter
        'dbAdapter2 = New OdbcDataAdapter("Select ID,Richiedente,Visto from T_Richiedente", dbConn)
        Dim cmdBuild As New OdbcCommandBuilder(dbAdapter)
        dbAdapter.UpdateCommand = cmdBuild.GetUpdateCommand()
 
        Dim sql As String
 
        sql = "Insert into T_Richiedente (ID,Richiedente,Visto) values (@ID,@Richiedente,@Visto)"
 
        Dim cmd As New OdbcCommand(sql, dbConn)
 
        dbAdapter.InsertCommand = cmd
        dbAdapter.InsertCommand.Parameters.Add("@ID", OdbcType.Int, 10, "ID")
        dbAdapter.InsertCommand.Parameters.Add("@Richiedente", OdbcType.NVarChar, 50, "Richiedente")
        dbAdapter.InsertCommand.Parameters.Add("@Visto", OdbcType.Bit, 1, "Visto")
        dbAdapter.Update(ds, "T_Richiedente")
 
    End Sub

>
Bravo!....però se c'è un insegnamento in tutto ciò....
 
è che quei link che ti ho postato dovresti "digerirli" per bene!Ancora 
ti sono parecchio oscuri!
 
....altrimenti domani l'altro sei di nuovo qui per un delete... per un 
join fra tabelle!!!
 
Ciao!
 


Eh lo so.. sto leggendo manuali e ogni cosa che imparo me la segno in un mio manuale ma ci vuole tempo ad apprendere tutto!!
Grazie