PROBLEMA CON ADAPTER

giovedì 19 marzo 2009 - 21.07

sergio.mitrione Profilo | Junior Member

Ciao a tutti...
scusate la domanda che potrebbe sembrare un pò stupida ma purtroppo non riesco a venirne fuori..
in un'applicazione mi collego ad un DB access con VS2008 in vb.net tramite oledb...
Per queste connessioni utilizzo un ole adapter (che ancora sto cercando bene di capire a cosa serva veramente) e
sparo i dati in un datagrid.
Ho un problema:
Quando effettuo la select non ci sonon problemi, anhce quando instanzio una delete o un update non mi ritorna errori
ma nel DB non effettua nessun cancellamento di record o nessun aggiornamento!!!
Come posso fare? Qualcuno saprebbe aiutarmi per cortesia?

Grazie a tutti

Jeremy Profilo | Guru

Ciao Sergio.
Il DataAdapter, vedilo come un'interfaccia tra i dati presenti nelle tabelle del Db e i dati presenti nelle DataTable del Dataset.
Per poterne usare i metodi di aggiornamento, inserimento ed eliminazione vanno comunque inizializati i rispettivi Command.
Per fare questo ci sono due strade:
La prima è quella dell'utilizzo di un CommandBuilder il quale si occuperebbe di inizializzare i suddetti Command tenendo conto dei campi presenti nell'istruzione di select(e quindi presenti nella dataTable).
La seconda è quella di istanziarli come hai istanziato il Command per la query di Select.

Ti posto un link dove si è parlato del primo metodo, il secondo, non dovresti trovare problemi ....se sei già riuscito a popolare il dataset, il concetto per i Command di inserimento,modifica ed eliminazione rimane lo stesso di quello di selezione.

Ecco il link
http://www.dotnethell.it/Forum/messages.aspx?ThreadID=28727
oppure
http://www.dotnethell.it/forum/messages.aspx?ThreadID=29008
c'è anche un progettino di esempio

Facci sapere....
Ciao

sergio.mitrione Profilo | Junior Member

Ciao Jeremy,
grazie mille per la tua risposta ma non riesco lo stesso ad uscirne...
Il problema è che mi effettua la delete sul dataset ma non lo effettua
sul DB direttamente... quindi quando rieseguo il progetto
è come se non avesse fatto nessuna modifica sul DB...
Leggevo in giro che alcuni usano il CommandBuilder... a cosa serve?
non hai un progettino piccolo piccolo dove posso
controllare cosa mi manca?

Jeremy Profilo | Guru

Ciao Sergio.
Ma hai letto il mio post precedente???
Sul secondo link, trovi anche un progettino di esempio.
Eventualmente mostra un pò di codice che hai scritto che vediamo di ragiornarci sopra insieme.

Facci sapere...
Ciao

sergio.mitrione Profilo | Junior Member

Ciao Jeremy,
si scusami non avevo visto il progettino... ora gli do un occhio e ti so dire :)

Grazie mille

Magari ci sentiamo dopo

sergio.mitrione Profilo | Junior Member

ciao Jeremy...rieccomi...
ho provato ma non mi cambia nulla...la modifica me la fa sul dataset ma non sul db
ti posto il codice

Private Sub prenotazioni_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

lbl_prenotazione_data.Text = "Prenotazioni in data odierna: " & Today.Day & "/" & Today.Month & "/" & Today.Year
connect()
Dim data_odierna As String = Today.Day & "/" & Today.Month & "/" & Today.Year

With selCommand
'.CommandText = "Select data, ora, n_tavolo, nome, conferma FROM prenotazione where data='" & data_odierna & "'"
.CommandText = "Select id, ora, n_tavolo, nome FROM prenotazione where data=#" & data_odierna & "#"
.CommandType = CommandType.Text
.Connection = conn
End With
'assign select command to data adapter
adapter.SelectCommand = selCommand

Dim cmb As New OleDb.OleDbCommandBuilder(adapter)
adapter.Fill(dt)

cmb.GetUpdateCommand()
cmb.GetDeleteCommand()
cmb.GetInsertCommand()


dg1.DataSource = dt
'dg1.Item(1, 1).Style.ForeColor = Color.DarkRed
dg1.Columns(1).Visible = False
dg1.Columns(2).HeaderText = "Ora"
dg1.Columns(3).HeaderText = "N. Tavolo"
dg1.Columns(4).HeaderText = "Prenotato da"
'dg1.Columns(4).HeaderText = "Conferma"

'dg1.Columns.Add("Elimina", "Elimina")

'Dim str As String() = {Nothing, "hello", "test"}

'dg1.Rows(0).Cells(4).Value = "aaa"

disconnect()
End Sub

********************** qua c'è il delete che non mi funziona sul DB *******************

Private Sub dg1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dg1.CellClick

If (e.ColumnIndex = 0) Then
Dim cmdbAccessCmdBuilder As New OleDbCommandBuilder(adapter)
Dim id As Integer = dg1.Rows(e.RowIndex).Cells(1).Value

Try

conn.Open()
Dim str_q As String = "Delete * from prenotazione where id=" & id
'string stores the command and CInt is used to convert number to string
selCommand = New OleDbCommand(str_q, conn)
Dim icount As Integer= selCommand.ExecuteNonQuery
'displays number of records inserted
Catch
End Try
conn.Close()
adapter.Update(dt)


End If


End Sub



Te ne sarei grato se riuscissi ad aiutarmi :)

Jeremy Profilo | Guru

L'errore sta nel fatto che stai usando due metodi diversi di interfacciamento con il database.....nel senso che, nella sub di eliminazione(quella gestita dall'evento cellclick) istanzi un nuovo command che, di per se, non è sbagliato ma, allora non usi il dataadapter per l'aggiornamento dei dati.....insomma, un pò un pasticcio.

Ad ogni modo...ora non ho tempo perchè sto partendo per Modena....stasera, appena arrivo in albergo, ti do qualche info in più.

>Te ne sarei grato se riuscissi ad aiutarmi :)
Se non hai fretta....stasera vediamo di uscirne fuori.

Ciao

sergio.mitrione Profilo | Junior Member

Tranquillo non ho fretta...grazie mille ancora :)
Aspetto tue :)

p.s. ho effettuato un pò di modifiche al codice... ho seguito il uo esempio che avevi postato in un altro post...
cancello sempre il record dal datagrid ma non riesco a fare la delete sul DB

Jeremy Profilo | Guru

Ciao Sergio.
Ho modificato il tuo codice l'essenziale giusto che funzioni(credo)

Ci sarebbero poi altri accorgimenti da fare ma, conviene risolvere un problema alla volta.
Il codice che ho modificato è solo quello relativo all'evento cellClick
Prova a fare copia ed incolla di questo codice e posta eventuali errori che potrei aver fatto in quanto non ho avuto modo di provarlo.

Ovviamente questo è solo uno dei modi che potresti usare per persistere le modifiche sul Db.

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

Facci sapere.....
Ciao

sergio.mitrione Profilo | Junior Member

Ciao Jeremy,
ho inserito il tuo codice ma non cambia nulla a livello di DB :(
te lo ri-posto così gli dai un occhio...

Imports System.Data
'Imports System.Data.OleDb
Imports System.Data.OleDb



Public Class prenotazioni

Private Ds As DataSet
Private ConnString As String = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=|DataDirectory|\reservation.mdb;Jet OLEDB:Database Password=sergio_1981"
Private Conn As OleDb.OleDbConnection
Private Da As OleDb.OleDbDataAdapter
Private Cmd As OleDb.OleDbCommand
Private Cmd_del As OleDb.OleDbCommand
Dim cmb As New OleDb.OleDbCommandBuilder(Da)
Dim data_odierna As String = Today.Day & "/" & Today.Month & "/" & Today.Year

Private Sub prenotazioni_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

lbl_prenotazione_data.Text = "Prenotazioni in data odierna: " & Today.Day & "/" & Today.Month & "/" & Today.Year
'connect()
For Each cnt As Control In Me.Controls
If TypeOf cnt Is TextBox Then
cnt.DataBindings.Clear()
End If
Next

conn = New OleDb.OleDbConnection(ConnString)
Cmd = New OleDb.OleDbCommand("Select id, ora, n_tavolo, nome FROM prenotazione where data=#" & data_odierna & "#", Conn)
Da = New OleDb.OleDbDataAdapter(Cmd)
Ds = New DataSet

Da.Fill(Ds, "prenotazione")
dg1.DataSource = Ds.Tables(0)

dg1.Columns(1).Visible = False
dg1.Refresh()
'TextBox1.DataBindings.Add("Text", Ds.Tables(0), "IdArticolo")
'TextBox2.DataBindings.Add("Text", Ds.Tables(0), "Articolo")
'TextBox3.DataBindings.Add("Text", Ds.Tables(0), "Descrizione")
'TextBox4.DataBindings.Add("Text", Ds.Tables(0), "Prezzo")
Dim cmb As New OleDb.OleDbCommandBuilder(Da)

Cmd_del = New OleDb.OleDbCommand("DELETE FROM prenotazione WHERE id = 1", Conn)
Cmd_del.CommandType = CommandType.Text
'Cmd_del.Parameters.Add("@" + Ds.Tables(0).Columns.Item(1).ColumnName, OleDb.OleDbType.VarChar, Ds.Tables(0).Columns.Item(1).MaxLength, Ds.Tables(0).Columns.Item(1).ColumnName)
Da.DeleteCommand = Cmd_del


cmb.GetUpdateCommand()
cmb.GetDeleteCommand()
cmb.GetInsertCommand()
'disconnect()


End Sub

Private Sub connect()
'Dim conn As New OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0;Data Source=|DataDirectory|\reservation.mdb;Jet OLEDB:Database Password=sergio_1981")
Try
conn.Open()
Catch ex As Exception
MsgBox(ex.Message)
End Try

End Sub
Private Sub disconnect()
Try
conn.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try

End Sub


Private Sub btn_close_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_close.Click
Me.Close()
End Sub

Private Sub dg1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dg1.CellClick

If (e.ColumnIndex = 0) Then



Dim cmdbAccessCmdBuilder As New OleDbCommandBuilder(Da)
Dim id As Integer = dg1.Rows(e.RowIndex).Cells(1).Value


Try
Dim str_q As String = "Delete * from prenotazione where id=" & id
MsgBox(str_q)

Cmd_del = New OleDbCommand(str_q, Conn)
connect()
Cmd_del.ExecuteNonQuery()
disconnect()
Ds.Tables("prenotazione").Rows(e.RowIndex).Delete()
Catch Ex As Exception
MessageBox.Show(Ex.Message)
End Try

End If

End Sub


End Class



come ti dicevo sul datagrid effettua la cancellazione ma non sul DB!!
Ma il commandbuilder lo devo usare???

Ciao e grazie ancora

Jeremy Profilo | Guru

Ciao Sergio
C'è ancora un bel pò di confusione.....forse è meglio per tutti se allegi il progettino cosi che io possa metterlo a posto e commentartelo.??
Poi ti spiego le modifiche che faccio e perchè.

Facci sapere....
Ciao

sergio.mitrione Profilo | Junior Member

ok...eccoti il progettino...:)

grazie mille ancora

Jeremy Profilo | Guru

Ciao Sergio.
In allegato il progettino.....appena ho un pò di tempo ti commento le modifiche che ho fatto.

Facci sapere...
Ciao

sergio.mitrione Profilo | Junior Member

Ciao jeremy..
inanzitutto grazie per il tuo aiuto...
ho provato il tuo eseguibile e funziona che è una meraviglia :)
come faccio ora a reimportare tutto il progetto che mi hai mandato?

Scusami la domanda stupida ma sono nuovo su .net

Jeremy Profilo | Guru

>come faccio ora a reimportare tutto il progetto che mi hai mandato?
Scusa ... ma non ho capito cosa intendi dire.

sergio.mitrione Profilo | Junior Member

nel senso...
io ho una soluzione giusto... per aprire il progetto clicco sulla
soluzione e me lo apre... ma se adesso clicco sulla tua soluzione
non mi trova nulla... come faccio a ricreare tutto il progetto?

spero di essermi spiegato bene :)

Jeremy Profilo | Guru

Ma ti da qualche errore?? perchè è strano!!!Non dovresti avere questi problemi.
Prova a cliccare sul file con estensione .vbproj anzichè su quello con estensione .sln.
Se continui ad avere problemi sostituisci i tuoi file con estensione .vb con quelli che ti ho mandato io.

Facci sapere...
Ciao

sergio.mitrione Profilo | Junior Member

in qualche modo ho risolto la partenza... ma non mi fa la delete sul DB... strano perchè se lancio il tuo
eseguibile la fa...
hai cambiato solo il prenotazioni.vb?

Jeremy Profilo | Guru

Ciao Sergio.
In VisualStudio, fai click con il tasto destro sul Database, e modifica il valore della proprietà "Copia nella directory di output" in "Non Copiare".

Facci sapere...
Ciao

sergio.mitrione Profilo | Junior Member

Ciao Jeremy,
scusa se ho più postato ma ho avuto altro da fare..
Cmq risolto grazie mille... funziona ora :)
Non è che hai anche qualche dritta da darmi su come creare un webservice? :D
Magari ti lascio un mio contatto se ti va ...

grazie ancora per l'aiuto

Jeremy Profilo | Guru

Ciao Sergio.

>Non è che hai anche qualche dritta da darmi su come creare un
>webservice? :D
Si .... però apri un nuovo thread così che anche altri possano intervenire leggendo il titolo che corrisponde all'argomento trattato e altri possano beneficiare degli interventi di tutti sull'argomento.
Tra le altre cose questo thread è stato accettato da te e quindi risulterebbe chiuso.

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