|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 1025
|
[vb.net] Dataset
Sono disperato...voglio chiedere una cosa...
io devo modificare dei dati all'interno di un database access...con il datareader riesco a visualizzare i dati all'interno dei controlli ma ovviamente non posso aggiungere righe o aggiornarle...volevo sapere come fare ad associare il mio database al dataset per poter modificarne i dati, aggiungere righe, fare delle select sui rispettivi campi e visualizzare i dati all'interno dei controlli del form... |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Jul 2002
Città: TV
Messaggi: 125
|
Penso valga più di mille parole..
Esempio per provider dati Sql dim cn as SqlClient.SqlConnection If Cn.State = ConnectionState.Closed Then ConnettiDatabase(User) 'mia funz. x la connessione al db End If If Cn.State = ConnectionState.Open Then Da.SelectCommand = New SqlCommand With (Da.SelectCommand) .Connection = Cn .CommandText = Query .CommandType = CommandType.Text .ExecuteNonQuery() End With Da.Fill(Ds, NomeTbl) Da.FillSchema(Ds.Tables(NomeTbl), SchemaType.Mapped) If CaricaCommand Then Dim cb As SqlCommandBuilder = New SqlCommandBuilder(Da) Da.UpdateCommand = cb.GetUpdateCommand Da.InsertCommand = cb.GetInsertCommand Da.DeleteCommand = cb.GetDeleteCommand End If If UseForEvents Then Dt = Ds.Tables(NomeTbl) End If Catch err As SqlClient.SqlException 'gestione errore Finally Cn.Close() End Try End Function idem se usi un altro provider dati(tipo Oledb o Odbc come nel tuo caso).Riassumo.. imports System.Data.OleDb Dim conn As New System.Data.OleDb.OleDbConnection(connection) Dim adapter As New System.Data.OleDb.OleDbDataAdapter Dim Dataset As DataSet adapter.SelectCommand = New OleDbCommand(query, conn) adapter.Fill(dataSet, "NomeTbl") Ora hai la tua/le tue datatable(dataset.Tables(NomeTbl).ecc...) in memoria.Non ti resta che fare il binding come hai fatto con il datareader. Per aggiunta/modifica/salvataggio ci sono i relativi metodi all'interno del datatable o nel dataadapter. Spero di essere stato chiaro e se hai domande..posta ![]() |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 1025
|
Quote:
scusami ma sono inesperto al massimo...voglio chiederti un enorme piacere...ho un database di prova, in access sul quale devo svolgere delle ricerche aggiungere righe eliminarle e modificarle...se te lo mando per via email anche con calma avresti il tempo di farmi un piccolo esempio con questo database??se ti creo io il form e ti invio anvìche quello me lo potresti collegare tu...??mi faresti un enorme piacere. |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 1025
|
dim conn as new System.data.oledb.oledbconnection(connessione
dim dataset as dataset oledbdataadapter1.selectcomand = new oledbcommand_(comando, connessione) oledbdataadapter.fill(dataset11) Sono Arrivato fin qua adesso dovrei inserire una nuova riga all'interno del database access il quale l'ho riferito ad un dataset...come faccio ad inserire un nuovo record??? |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Jul 2002
Città: TV
Messaggi: 125
|
Posto
Dim ds As DataSet Dim da As System.Data.OleDb.OleDbDataAdapter ds.Tables("NomeTbl").Rows.Add(<row o singoli valori>) ds.Tables("NomeTbl").Rows(0).Delete() da.Update(ds.Tables("NomeTbl")) Attenzione che per eseguire l'update devono essere settati i command di update,delete e add.Questo o lo fai manualmente o devi usare l'oggetto CommandBuilder specifico del provider che stai usando: Dim CmbBld As New OleDb.OleDbCommandBuilder(da) da.DeleteCommand = CmbBld.GetDeleteCommand da.InsertCommand = CmbBld.GetInsertCommand da.UpdateCommand = CmbBld.GetUpdateCommand ricordando che questo comodissimo oggetto funziona solo per delle select semplici(niente join ecc..) e che la tabella risultante della query deve avere obbligatoriamente un campo che fa da chiave primaria. Dai che ti manca quasi solo il bind dopo ![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 1025
|
non ho capito bene a cosa serve il commandbuilder...io nelle proprietà del data adapter vedo che ci sono questi:
insertcommand deletecommand update command con la rispettiva commandtext... |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Jul 2002
Città: TV
Messaggi: 125
|
Si nel DataAdapter ci sono i 3 command contenenti le query per eseguire le operazione di modifica nel db.Verifica se dopo aver fatto il fill della table sono già valorizzate.Se si tanto meglio,non ti serve fare nulla più..ma se esegui solo la Select quelle tre property dovrebbero essere vuote e quindi ti può tornare utile usare il command builder per riempirle automaticamente..
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 1025
|
scusami adesso ti posto quello che sto facendo sono arrivato quì:
Dim conn As New System.Data.OleDb.OleDbConnection_(OleDbConnection1.ConnectionString) Dim dataset As DataSet OleDbDataAdapter1.SelectCommand = New OleDbCommand_(OleDbCommand1.CommandText, conn) OleDbDataAdapter1.Fill(DataSet11) OleDbDataAdapter1.FillSchema(DataSet11,_ SchemaType.Mapped, "ArcImpiegati") Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder_(OleDbDataAdapter1) dataset.Tables("ArcImpiegati").Rows.Add() io all'interno del mio database devo inserire 'nome utente','telefono','nome ufficio' come faccio a dirglielo di aggiungerlo...dove inserisco questi valori...mi serve un data row perchè così come mi hai scritto tu non me lo lascia fare. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 1025
|
ho fatto cosi e ci sono riuscito però nel mio database access non vedo la riga nuova che ho inserito...
Dim conn As New System.Data.OleDb.OleDbConnection(OleDbConnection1.ConnectionString) Dim dataset As DataSet Dim row As DataRow OleDbDataAdapter1.SelectCommand = New OleDbCommand(OleDbCommand1.CommandText, conn) OleDbDataAdapter1.Fill(DataSet11) OleDbDataAdapter1.FillSchema(DataSet11, SchemaType.Mapped, "ArcImpiegati") Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(OleDbDataAdapter1) row = DataSet11.ArcImpiegati.NewRow row.Item("IDimpiegato") = "23" row.Item("impiegato") = "luigi" DataSet11.ArcImpiegati.Rows.Add(row) |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Jul 2002
Città: TV
Messaggi: 125
|
Mmm mi sa che c'e' un pò di confusione.
Da quanto posso capire hai usato mezzi controlli data trascinati sulla form e mezzo via codice,questo perche' una cosa cosi " DataSet11.ArcImpiegati" non potrebbe mai funzionarti con gli esempi che ti ho fatto io. Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(OleDbDataAdapter1) questo poi non serve a nulla se non ci aggiungi le istruzioni che ti ho postato sopra. Segui passo passo il codice che ti ho allegato e leggi i commenti che ti ho lasciato per la spiegazione. row = DataSet11.ArcImpiegati.NewRow row.Item("IDimpiegato") = "23" row.Item("impiegato") = "luigi" DataSet11.ArcImpiegati.Rows.Add(row) "ho fatto cosi e ci sono riuscito però nel mio database access non vedo la riga nuova che ho inserito... " chiaro!Ado.Net lavora in modalità disconnessa..quindi in quel modo hai aggiunto una riga sulla table in memoria non sulla tabella sul db. Il "trasferimento" di tutte le modifiche sul db avviene quando esegui il dataadapter.update(<param>). Cmq ti allego il codice per fare tutto questo,devi solo cambiare nome del db,query e la funzione di add con le tue colonne e i tuoi dati.. |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 1025
|
dice che è una versione precedente a quella che ho io di vb.net e non me lo apre il file che mi hai postato..
|
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Jul 2002
Città: TV
Messaggi: 125
|
Io ho la versione 2003,probabilmente hai la precedente.Crea un nuovo progetto vuoto e includi i Form1.vb e Form1.resx
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 1025
|
grazie mille...sei stato chiarissimo...io comunque ho trovato anche il modo diaggiungere modificare direttamente sul database con nnstruzione sql...solo che in questo caso lavoro sempre connesso giusto??se voglio lavorare disconnesso devo utilizzare il tuo metodo...
devo ancora capire l'utilità del commandbuilder...ho guardato anche nella guida ma non riesco a capire niente... |
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Jul 2002
Città: TV
Messaggi: 125
|
Si si può lavorare anche in maniera connessa,un esempio e' il datareader o eseguendo direttamente una query di modifica,ad esempio,"INSERT INTO..".Mi puoi postare il codice sul metodo che hai implementato?
CommandBuilder Quando esegui la select per riempire la tabella il dataadapter,che e' il tuo ponte tra il dataset e la fonte dati,non conosce a priori i comandi sql per l'inserimento,l'update e la cancellazione rispetto alla tua fonte dati. Infatti se tu dopo il fill,in runtime,vai a verificare il valore ad esempio del dataadapter.InsertCommand vedrai che e' nothing. Questo significa che il dataadapter non sa come fare l'insert delle tue righe nel db. Qui interviene il commandbuilder(con il codice che ho postato) che valorizza i tuoi command di modifica.Se infatti verifichi il valore di dataadapter.InsertCommand dopo l'esecuzione delle 4 righe righe relative al command builder vedrai che non sarà più a nothing ma varra una cosa simile a "INSERT INTO Anagrafica( IdArchivio , Codice , Nome , PersonaFisica , Cognome , Titolo , NascitaLoc , NascitaProv , NascitaNaz , NascitaData , PartitaIVA , CodFiscale , IdTipoAnagrafica , Note , NoteView ) VALUES ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? )" che e' il tuo comando di Insert per la tua select.Più chiaro ora? |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 1025
|
esatto infatti io quel codice lì c'è l'ho già impostato quindi non dovrebbe servirmi....il metodo che ho impementato sono istruzioni sql dirette come hai detto tu, come INSERT TO ECC..
Volevo sapere le ultime 2 cose...io devo fare un inserimento in un campo di un determinato record con un parametro (che è il text di una textbox) volevo sapere dove e come devo inserire il parametro...io sono arrivato quì... Dim cmInsPrestito As New OleDbCommand("INSERT INTO ArcImpiegati(Data, Impiegato, NumTelefono, Prestito, Utente) VALUES ("", "", "", 'si', "")", CnProva) dove Impiegato = textbox1.text in modo tale che lui mi inserisca "si" nel campo prestito solo dell'impiegato che c'è nella text... |
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: Jul 2002
Città: TV
Messaggi: 125
|
Dim cmInsPrestito As New OleDbCommand("INSERT INTO ArcImpiegati(Data, Impiegato, NumTelefono, Prestito, Utente) VALUES ("", "", "", '" & textbox1.text & "', "") WHERE Impiegato=' & <nomeimpiegato> & "'"", CnProva)
Cmq se usi query dirette stai sbagliando metodo di lavoro e complicando decisamente la vita. Dal codice da me postato ti bastava bindare una listbox per l'elenco impiegati e,ad esempio,una checkbox per il campo prestito e avevi già tutto sto lavoro fatto in automatico.. |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 1025
|
Adesso provo anche con il tuo codice...Devo seguire sempre quello che mi hai postato vero??
poi io ho bisogno di fare delle select sul database per andare a vedere cosa valgono specifici campi relativi ad una record... per esempio io voglio fare una select per vedere se in quel impiegato il campo prestito è vuoto o ha un valore, insomma voglio visualizzare il contenuto che c'è nel campo prestito...posso fare con un datareader?? come si faceva in vb6 recordset!nome campo = textbox.text mi sono spiegato?? |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 1025
|
Dim cmInsPrestito As New OleDbCommand("INSERT INTO ArcImpiegati (Data, Impiegato, NumTelefono, Prestito, Utente) VALUES ("","", "", '" & txtTitolo.Text & "', "")WHERE Impiegato =' & txtTitolo.text & """, CnProva)
cmInsPrestito.ExecuteNonQuery() non mi funziona |
![]() |
![]() |
![]() |
#19 | |
Member
Iscritto dal: Jul 2002
Città: TV
Messaggi: 125
|
Quote:
ds.tables("ArcImpiegati").Rows(indice).item(Prestito) = textbox.text se ti tieni un oggetto CurRow di tipo Datarow che rappresenta la riga corrente nella tua datatable basta CurRow.item(Prestito)= textbox.text Se invece e' una riga generica puoi usare il metodo Select sulla datatable Row=ds.tables("ArcImpiegati").Select(<criterio>) Row.item(Prestito)= textbox.text o,se hai la chiave primaria Row=ds.tables("ArcImpiegati").Rows.Find(<ValoreChiavePrimaria>) Row.item(Prestito)= textbox.text ma questi metodi valgono per un approcio disconnesso mentre,a quanto sembra,hai implementato il tutto in altra maniera.. [/quote] non mi funziona[/quote] dimmi almeno che errore ti da.. Ultima modifica di Geen : 08-04-2004 alle 15:33. |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Sep 2003
Messaggi: 1025
|
non mi da nessun errore in particolare...penso non gli piacciano degli argomenti sul WHERE perchè ho fatto la stessa cosa senza il parametro e funziona...
cosa intendi per (<criterio>) un'istruzione come "select acrImpiegati...ecc |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:11.