[VB 2005 express] Connessione a gestione DB Access da codice senza wiz...

domenica 24 agosto 2008 - 15.02

plaguebreath Profilo | Junior Member

Salve a tutti, sono ancora qui con i miei dubbi e i molti problemi che sto avendo nel mio viaggio travagliato all'interno di VB.NETCome ho scritto sopra voglio gestire ed elaborare un database Access senza usare nessun tipo di widzard e quindi voglio capire le varie istruzioni, dove usarle e quando servono. Per fare ciò mi son creato un piccolo database con una tabella di esempio che si chiama Categoria, formata da un campo ID che è chiave primaria autoincrementale e un campo testo Descrizione. Fatto questo ho creato un form generico e ci ho piazzato il seguente codice zeppo di errori per cui vi chiedo aiuto per farmi capire dove sbaglio :)


Imports System.Data.Odbc

Public Class Form1
Public DB As New OleDbConnection 'database
Public DA As New OleDbDataAdapter 'dichiaro pubblicamente il dataadapter
Public DS As New DataSet 'dichiaro il dataset
Dim descrizioneold As String

'con questo esempio voglio provare a gestire interamente via codice una tabella di un
'database access
Public Sub apridb()
'funzione che si occupa di creare la connessione al database

Try
DB.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\dbtest.mdb"
DB.Open()
Catch ex As Exception
MsgBox("Errore, database inesistente, impossibile continuare", MsgBoxStyle.Critical)
Me.Close()
'gestisco errore in caso inesistenza database
End Try
End Sub

Public Sub chiudidb()
'funzione che chiude la connessione al database access
'MessageBox.Show("chiudo connessione database")
DB.Close()
DB.Dispose()
End Sub

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

Dim sql As String
sql = "SELECT *"
sql = sql + " FROM CATEGORIE"
Dim cmd = New OleDbCommand(sql, DB) 'comando select
' Dim cb As New OleDbCommandBuilder(DA) 'creo un command builder

'apriamo la connessione al database
apridb()
' Assegnamo il comando al DataAdapter.
DA.SelectCommand = cmd

'apriamo la connessione al database
apridb()
Dim DS As New DataSet("dsCategorie") 'creo il dataset

DA.MissingSchemaAction = MissingSchemaAction.AddWithKey

' Riempiamo il DataSet specificando il nome della tabella.
DS.Clear()
DA.Fill(DS, "Categorie")

'passaggio del dataset al datagridview attraverso il binding al dataset
DataGridView1.DataSource = DS
DataGridView1.DataMember = "Categorie"

'eseguo il binding della casella di textbox con il DATASET
TextBox1.DataBindings.Add("Text", DS, "Categorie.ID")

'eseguo il binding della casella di textbox con il DATASET
TextBox2.DataBindings.Add("Text", DS, "Categorie.Descrizione")
chiudidb()

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Form2.Show() 'non serve al momento
End Sub

Private Sub Insert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Insert.Click
If Insert.Text = "Inserisci" Then
TextBox2.ReadOnly = False
Insert.Text = "Annulla"
Modifica.Enabled = False
DataGridView1.AllowUserToAddRows = True
DataGridView1.BeginEdit(True)
DataGridView1.CurrentCell = DataGridView1(DataGridView1.FirstDisplayedCell.ColumnIndex, DataGridView1.Rows.Count - 1)
DS.AcceptChanges()
DataGridView1.Enabled = False
'in caso di pressione del tasto insert voglio che venga creato una nuova riga
'nel datagridview
Else
Modifica.Enabled = True
TextBox2.ReadOnly = True
Insert.Text = "Inserisci"
DataGridView1.CancelEdit()
DataGridView1.Enabled = True
DataGridView1.BeginEdit(False)
DataGridView1.AllowUserToAddRows = False

End If

End Sub

Private Sub Cancella_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancella.Click
'il tasto è disabilitato in quanto non deve produrre la cencellazione di
'nessun record in quanto non si può cancellare nessun record in categoria
End Sub

Private Sub Modifica_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Modifica.Click
'Dim descrizioneold As String

If Modifica.Text = "Modifica" Then
descrizioneold = DataGridView1.CurrentRow.Cells(1).Value
MessageBox.Show(descrizioneold)
Modifica.Text = "Annulla"

Insert.Enabled = False
'DataGridView1.CurrentCell = DataGridView1(DataGridView1.FirstDisplayedCell.ColumnIndex, DataGridView1.Rows.Count - 1)
DataGridView1.Enabled = False
'DataGridView1.BeginEdit(True)
TextBox2.ReadOnly = False
Else
DataGridView1.CurrentRow.Cells(1).Value = descrizioneold
TextBox2.Text = descrizioneold
Modifica.Text = "Modifica"
Insert.Enabled = True
DataGridView1.Enabled = True
'DataGridView1.BeginEdit(True)
TextBox2.ReadOnly = True
End If
End Sub

Private Sub Salva_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Salva.Click
apridb()
' Try


Validate()
DataGridView1.EndEdit()


MessageBox.Show(DS.HasChanges())
DA.Update(DS, "Categorie")
MsgBox("Update successful")

'Catch ex As Exception
'MsgBox("Update failed")
' End Try
chiudidb()


End Sub
End Class




Il form è composto da un datagridview che è impstato su readonly e DataGridViewEditMode.EditProgrammatically (non voglio che gli utenti elaborino da qui i dati voglio che lo facciano solo tramite la gestione di due textbox bindate, è giusto ?)
Poi ci sono 2 textbox bindate e 4 pulsanti, per inserimento nuovo record, modifica, canzellazione e salvatggio.
Se eseguo il programma e faccio ad esempio una modifica o un inserimento ricevo il seguente errore:

sul codice di salva -
Update non è in grado di trovare TableMapping['Categorie'] o DataTable 'Categorie'.

Oltretutto se controllo lo stato del dataset.haschanged() mi da sempre false ..... perchè ?
La connessione al database quando va fatta ?

Grazie a tutti per la pazienza nella lettura

TOPOAMORE Profilo | Expert

Ciao prova cosi e vedi che ti dice

Vai a modificare l'istruzione

DA.Update(DS,"Categorie") con DA.Update(DS.Table(0))

Se ti da errore postalo e vediamo

plaguebreath Profilo | Junior Member

Grazie prima di tutto, ho fatto la modifica e mi da errore di compilazione

Errore 1 "Table" non è un membro di "System.Data.DataSet".

TOPOAMORE Profilo | Expert

DA.Update(DS,"Categorie") con DA.Update(DS.Tables(0))

ho mancato una "s" prova e vedi che dice

plaguebreath Profilo | Junior Member

purtroppo .. Impossibile trovare la tabella 0
non capisco il perchè sembra che non riconosca la struttura del dataset ...

TOPOAMORE Profilo | Expert

Il problema e che non esistono tabelle all'interno del dataset.
Prova cosi

Crea un variabile DATASET e DataAdapter globale

Dim Ds as new DataSet Dim Da as new oleDataAdapter
Dopo di che quando fai la select per popolare il datagrid crea una tabella:

Dim Dt as new DataTable("Categoria")

e l'assegni al Dataset

ds.tables.add(Dt)

Quando farai il fill lo farai cosi:

Da.fill(ds.tables(0))

Compi tutte le tue operazioni e quando farai l'update prova:

Da.Update(Ds.tables(0))

Fammi sapere

Caioo

plaguebreath Profilo | Junior Member

Devo provare la tua soluzione però ti chiedo una cosa, perchè devo fare questo quando ho visto che su internet si può fare nella maniera con cui ho scritto il codice e sopratutto il primo fill me lo fa correttamente ? Grazie

TOPOAMORE Profilo | Expert

Scusami io cosi riesco bene poi non so dove hai letto su internet cio che hai scritto e non so dirti se funzioni oppure no ma io quello che ho scritto funziona. Ora sta a te provare e vedere se funziona.

Ciao e buona continuazione

plaguebreath Profilo | Junior Member

Hem credo di aver ancora qualche problema, che istruzioni devo cambiare perchè adesso mi da errore nell'assegnamento del binding con il Datagrid, nel member mi da errore per il campo "Categoria" ... scusami ancora.

TOPOAMORE Profilo | Expert

Queste due istruzioni nel load:

DataGridView1.DataSource = DS DataGridView1.DataMember = "Categorie"

diventano questa:

DataGridView1.DataSource = DS.tables(0)

plaguebreath Profilo | Junior Member

mentre per il databinding ai due campi text come cambia ? Grazie

TOPOAMORE Profilo | Expert

cambia:

TextBox1.DataBindings.Add("Text", DS, "Categorie.ID")

con

TextBox1.DataBindings.Add("Text", DS.tables(0), "ID")

e uguale per la text2 con il campo che serve a te.

fammi sapere come va.

ciaooo

plaguebreath Profilo | Junior Member

Ho fatto le modifiche che mi hai detto tu e mi credi se ti dico che non fa nessuna modifica ? :(

TOPOAMORE Profilo | Expert

Non ti da nessun errore? cosa fa?

plaguebreath Profilo | Junior Member

Allora nell'insert non mi da nessun errore, però se clicco su salva non mi salva nulla e lo stato del recordset me lo da sempre a false.
Se invece faccio una cavolata, clicco su insert, non inserisco nessun valore però mi sposto con il mouse su un vecchio record e cambio una voce mi da che lo stato del dataset e changed e mi restituisce questo errore.

Update richiede un UpdateCommand valido se l'insieme DataRow viene passato con righe modificate.

il mistero si infittisce

TOPOAMORE Profilo | Expert

L'errore e che non e esatto il codice dell'updatecommand
Pultroppo tu usi il commandbuilder. Creati un update command da codice. Dimmi se ti serve una mano dimmi che ti aiuto.

Ciaooo

plaguebreath Profilo | Junior Member

Se riesci a darmi una mano anche in questo te ne sarei immensamente grato, in sostanza non devo usare il commandbuilder ma crearmi io una update personalizzata ? Ma poi ad esempio come faccio a gestire le modifiche ? Grazie ancora per la pazienza

TOPOAMORE Profilo | Expert

io ad esempio mi creo delle librerie con tutte le modifiche da fare. Ti spiego visto che sto sviluppando un'applicazione abbastanza complessa mi serve poter gestire i cambiamenti di chiamate al DB in modo rapido, quindi io aggiorno la DLL e come se avessi cambiato le chiamate al DB.
Nel tuo caso creati una sub nel progetto e scrivi questo:

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

ricorda di impostare il tipo esatto per ogni campo, lo stesso che hai usato nel db o ti dara errore: oletype.text o int o bit.

prova e fammi sapere
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