Come risolvere il problema con DataSet e connessione al database in Visual Studio?
Sto usando VB.NET con un database MS Access. Ci sono due tabelle con una relazione tra loro.
Ho seguito quanto segue per stabilire una connessione al database con il set di dati e la sorgente di associazione.
- In Origine dati aggiungi nuova origine dati
- Database come tipo di origine dati
- Set di dati come modello di database >>
- Connessione dati selezionata
- Sotto l' oggetto database , ho selezionato le tabelle che vogliono per lo scopo come la tabella dei clienti anche cliccate sulle viste
- Quindi finisci.
- Ora in Origine dati , selezionare Set di dati , quindi Tabella dei clienti e trascinare i dettagli e la visualizzazione della griglia dei dati nel modulo e aggiungere i pulsanti per l'aggiunta, l'eliminazione dell'aggiornamento dei record.
- Ora esegui l'applicazione.
Dopo aver eseguito l'applicazione, ma non visualizza , aggiunge , aggiorna ed elimina record dal / al database.
Codice per l'aggiunta di un record al database
CustomersBindingSource.AddNew()
Codice per l'aggiornamento di un record nel database
CustomersBindingSource.EndEdit()
CustomersTableAdapter.Update(SrsbdbDataSet.Customers)
Codice per l'eliminazione di un record dal database
CustomersBindingSource.RemoveCurrent()
Ho anche modificato una stringa di connessione dal file app.config per verificare il problema della stringa di connessione, ma non è utile per il problema.
Per favore fatemi sapere dove sto sbagliando.
Risposte
CustomersBindingSource.AddNew ()
Questo non aggiunge un record al database di accesso , aggiunge un record all'elenco di BindingSource, che (quando EndEdit viene chiamato su BindingSource) viene inserito nel YourDataSetName.Customers
DataTable come nuovo DataRow, se dovessi guardare tutte le righe in YourDataSetName.Customers
vedresti che ce ne sono alcuni (scaricati dal db probabilmente, quando hai avviato l'app) e hanno un DataRowState di Unchanged, e poi c'è quello nuovo che hai aggiunto, con un DataRowState di Added
Niente è stato ancora salvato nel DB. Questi dati sono solo nel datatable del set di dati, che è una rappresentazione lato client di una tabella di database. E ' non è una tabella di database in sé e per sé. Può certamente avere più o meno colonne e di diverso tipo, rispetto alla tabella del database. È solo una memoria temporanea per i dati del database; ne scarichi alcuni, ne aggiungi altri, ne modifichi, li cancelli, magari li salvi ecc. Il DataRow pertinente tiene traccia di tutte queste cose che fai sui suoi dati e nota se è stato aggiunto / modificato / eliminato / immutato ecc.
Il TableAdapter è l'elemento che spinge i dati avanti e indietro tra DataTable e il database
Chiami CustomersTableAdapter.Update()
quando vuoi salvare i dati nel DB. Denominarlo è Update
stata un'idea schifosa per conto di Microsoft, perché porta le persone a pensare che esegua solo query SQL UPDATE; se fosse stato chiamato SaveChanges
(e in seguito lo è stato; EF usa SaveChanges) sarebbe più chiaro .. Devi solo ricordarlo - "Aggiorna significa Salva"
Quindi chiami Update(datatable or dataset here)
e passi il tuo DataTable con tutte le sue righe modificate / eliminate / aggiunte. TableAdapter analizza l'intera riga di DataTable per riga esaminando DataRowState di ogni riga. Se è aggiunto, il TableAdapter chiamerà la sua query INSERT SQL incorporata per salvare la riga. Se è modificato, viene eseguito SQL UPDATE. Lo stato cancellato causa una cancellazione SQL. Un datarow conosce i dati originali che sono stati scaricati e i dati come sono adesso; questo a volte è vitale per capire se qualcun altro ha salvato questa riga nel tempo in cui ce l'avevamo, così possiamo evitare di sovrascrivere le sue modifiche con le nostre
Alla fine di questo processo, i dati sono stati salvati, gli stati di riga sono stati tutti impostati da quello che erano, a Invariato (poiché i dati nel db ora sono gli stessi, i dati di riga non hanno più bisogno di essere salvati).
Pensa a quella parte del processo come al piccolo * che appare in una scheda dell'editor di testo, quando modifichi il file: un datarow nello stato Aggiunto / Modificato / Eliminato ha modifiche non salvate che devono essere salvate. Dopo il salvataggio, lo stato torna a Invariato. Ho già detto che TableAdapter.Update avrebbe dovuto chiamarsi Salva?
Tutto sommato , il processo per il salvataggio sarebbe quello di chiedere al controllo di modifica di EndEdit()
chiedere quindi all'origine di associazione pertinente EndEdit
: questo garantisce di avere un datatable con tutte le modifiche confermate e pronte per il salvataggio, quindi chiamare il file tableadapter.Update
. Probabilmente il controllo che l'utente stava digitando eseguirà il commit delle sue modifiche quando perde il focus, poiché l'utente fa clic sul pulsante di salvataggio .. Ma la chiamata a endedit si assicura. Se non sei sicuro, crea un nuovo modulo, rilascia un DataGridView su di esso fuori dalla finestra Origini dati e dai un'occhiata a come è cablato il pulsante Salva: dalla memoria esegue un Validate, un paio di EndEdit e un UpdateAll (TableAdapterManager, gestisce i TableAdapter, chiama Update su di essi nell'ordine corretto per assicurarsi che le righe padre vengano salvate prima delle righe figlio)
Se hai iniziato a fare più modifiche, gli stati delle righe cambierebbero di nuovo ma, proprio come prima, la cosa che impegna le modifiche al DB è TableAdapter.Update () indipendentemente dal tipo di modifica apportata
L'ultima cosa a cui prestare attenzione qui è che Access è un database basato su file. Probabilmente hai il tuo progetto ad esempio:
C:\projects\accesswhatever\
E avevi il tuo db di accesso ad esempio sul desktop:
c:\users\you\desktop\access.mdb
Quando hai collegato il db di accesso alle cose, VS ha presentato una finestra di dialogo lunga e prolissa (che nessuno legge;)) dove in pratica dice "metterò il db nel tuo progetto, e lo farò copiare nel bin quando si crea " .
Quindi fai clic su OK senza considerare le sue ramificazioni e costruisci. Il tuo disco ora ha il seguente aspetto:
C:\users\you\desktop\access.mdb 'call it DB X
C:\projects\accesswhatever\access.mdb 'call it DB Y
C:\projects\accesswhatever\bin\debug\access.mdb 'call it DB Z
Il tuo programma in esecuzione salverà i dati nell'ultimo, DB Z. Ogni volta che compili (cosa che potrebbe accadere ogni volta che fai clic su play, se apporti modifiche al codice), visual studio eliminerà Z e copierà Y su Z.
Adesso sei davvero confuso; il tuo codice dice che sta salvando. Stai cercando in DB X sul desktop o DB Y nella tua base di progetti e ti chiedi dove diavolo sono questi dati?
È in DB Z, nella bin\debug
cartella, accanto al tuo app.exe - ricorda solo che ogni volta che costruisci, VS cancella il tuo database modificato e lo sostituisce con uno pulito di quando. Se si desidera modificare questa impostazione, fare clic sul database in Esplora soluzioni e impostare "Copia nell'output" da "Copia sempre" a "Copia se più recente". Ora verrà copiato solo ogni volta che apporti una modifica allo schema, quindi .. Aggiungi una nuova tabella e VS cancellerà il tuo db di test ben curato con uno nuovo .. Ma è più simile a OK perché il nuovo DB vuoto almeno lo ha tabella aggiuntiva che il tuo programma andrà in crash senza :)
Un'alternativa consiste nell'aggiungere il nuovo record direttamente in DataGridView e utilizzare il nuovo OleDbDataAdapter per la connessione.
Rimuovere 'CustomersBindingSource.AddNew ()' e modificare il record in DataGridView:

Codice nel pulsante "Aggiorna record".
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim connstring = "your connection string"
Dim adapter As OleDbDataAdapter = New OleDbDataAdapter("select * from Customer", connstring)
Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(adapter)
builder.QuotePrefix = "["
builder.QuoteSuffix = "]"
adapter.Update(CustomerDataSet.Customer)
End Sub