View Full Version : [vb.net] Dataset
mangzeus
07-04-2004, 15:24
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...
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 ;)
mangzeus
07-04-2004, 16:10
Originariamente inviato da Geen
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 ;)
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.
mangzeus
08-04-2004, 07:56
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???
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 ;)
mangzeus
08-04-2004, 08:37
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...
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..
mangzeus
08-04-2004, 08:58
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.
mangzeus
08-04-2004, 09:12
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)
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..
mangzeus
08-04-2004, 11:35
dice che è una versione precedente a quella che ho io di vb.net e non me lo apre il file che mi hai postato..
Io ho la versione 2003,probabilmente hai la precedente.Crea un nuovo progetto vuoto e includi i Form1.vb e Form1.resx
mangzeus
08-04-2004, 11:54
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...
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?
mangzeus
08-04-2004, 14:08
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...
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..
mangzeus
08-04-2004, 14:23
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??
mangzeus
08-04-2004, 14:55
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
Originariamente inviato da mangzeus
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??
in generale
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..
mangzeus
09-04-2004, 08:04
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
beh se e' sbagliata la sintassi un errore te lo deve dare..se non e' sbagliata vuol dire che o ha fatto il suo dovere..
quando hai la dattatable in memoria puoi eseguire filtraggi,ordinamenti ,ricerche ecc..
un metodo per fa cercare un record e' la select sulla row collections:
ds.tables("ArcImpiegati").Select(Codice=15 )
<criterio> non e' altro che il tuo criterio per la tua ricerca (restituisce una o più righe)
mangzeus
09-04-2004, 10:13
Ho seguito passo passo quelo che mi hai postato e ci sono riuscito a farlo funzionare..grazie mille...l'istruzione sql devo ancora correggerla mi da l'errore "operazione non gestita"
scusa ma non capisco in "criterio che codice ci devo mettere
esempio...
io nel record dove l'impiegato è Marco Verdi voglio sapere se prestito = "si" quindi se nel campo del database prestito ha come valore il testo "si"
io come mi hai detto tu faccio la ricerca sul record
ma devo inserire un certo parametro per farmi ritornare la riga dove l'utente è Marco Verdi
ds.tables("ArcImpiegati").Select(Codice=15 )
non mi riesco a spiegare forse
ecco come tu mi hai messo quì
ds.tables("ArcImpiegati").Rows(indice).item(Prestito) = textbox.text io nella riga indice ci voglio mettere non l'idic della riga perchè non lo posso sapere...ne ho mille di righe che vengono aggiunte..io in quell'indice ci voglio mettere "dove nome impiegato, o nome utente" risulta = a una textbox o un determinato nome es "Marco Verdi"
mangzeus
09-04-2004, 11:31
ho fatto così:
ds = dsprova1
dim row as Datarow()
row = ds.tables("arcImpiegati").Select("Impiegato" = Marco", "impiegato)
in questo modo dovrebbe farmi la select sulla tabella arcimpiegati per quanto riguarda la riga dove "impiegato = Marco" giusto??
adesso non riesco ad associare il campo prestito, di questo determinato record, ad una textbox...ho sagliato qualcosa???
row.item(Prestito)=txtprestito non funziona perchè mi dice che Item non è una proprietà di row.
Originariamente inviato da mangzeus
io nel record dove l'impiegato è Marco Verdi voglio sapere se prestito = "si" quindi se nel campo del database prestito ha come valore il testo "si"
Supposto che in apertura della form ti sei creato la table in memoria tramite il sistema che ti ho spiegato all'inizio..
Ora per selezionare i singoli record puoi usare la Select sulla collezione di righe in memoria.
Dim ResultRow As DataRow()
ResultRow = ds.Tables("ArcImpiegati").Select("Impiegato='Marco Verdi'")
in ResultRow,che e' un ARRAY(x questo ti diceva che Item non e' una proprietà di row),avrai ora l'insieme delle righe la cui colonna impiegato contiene Marco Verdi.Supponendo che ne esista solo una nel tuo database
con ResultRow(0) puoi accedere a tutti i campi di quel singolo record
Come?
TextBox1.Text=ResultRow(0).Item("Prestito")
dopo questa istruzione la textbox visualizzerà il contenuto della cella nella colonna prestito del record che ha Impiegato='Marco Verdi'.Più chiaro ora?
A questo punto mi sento di suggerirti,per quello che ho potuto intravedere del tuo progetto quanto sotto:
-tira dentro una listbox sulla form
-dopo aver creato la tabella in memoria tramite il solito metodo
scrivi queste istruzioni:
ListBox1.DataSource = Ds.Tables("ArcImpiegati") ListBox1.DisplayMember = "Impiegato"
ListBox1.ValueMember = "Codice" 'opzionale,mettilo se hai un campo codice/id
in questo modo hai fatto il bind di un controllo
-Dichiara globale alla form
Public CurRow as DataRow
-crea un evento
ListBox1_SelectedIndexChanged
-mettici dento questa istruzione
CurRow=ListBox1.SelectedItem
Ora se hai eseguito una query del tipo "SELECT * FROM TABELLAIMPIEGATI" nella listbox dovresti la lista degli impiegati.
A ogni nuova selezione di un elemento nella ListBox viene attualizzata la riga corrente CurRow(ti evita le select di inizio post)
Ora che hai sempre la riga corrente tira dentro i controlli textbox o quant'altro che ti servono x visualizzare i dati di ciascun record e :
-o fai il binding come per la listbox
-o popoli a mano dentro la ListBox1_SelectedIndexChanged
TxtImpiegatoNAme.Text=CurRow.Item("Impiegato")
CkPrestito.Checked=CurRow.Item("Prestito") 'funzia se e' un campo BOOL
Direi che di + non posso fare ;)
mangzeus
09-04-2004, 14:10
Si io ho messo il mio codice nell'esempio che tu mi hai postato e mi funziona tutto compreso l'aggiornamento al database quindi mi sono costruito la table in memoria....l'unico problema adesso è capire come fae questo...adesso mi guardo quello che mi hai postato...
mangzeus
09-04-2004, 14:22
a dirti la verita stamattina ci ho provato a fare così ma con l'indice 0 mi dice indici fuori dalla matrice anche se il record c'è all'interno del database ti posto tutto quello che ho fatto...
Dim conn As New OleDbConnection()
Dim ds As New DataSet()
Dim da As New OleDbDataAdapter()
'Dim Cn As New OleDbConnection() 'o se no metto cn come oledbconnection1 e poi dovrebbe funzionare...
Public NomeFileDb As String = "C:\Documents and Settings\MARCO\Desktop\Prova.mdb"
Public Sub PopolaTabella(ByVal Query As String, ByVal NomeTbl As String, ByVal NomeFileDb As String)
da = OleDbDataAdapter1
ds = DsProva1
Try
OleDbConnection1.Open()
If OleDbConnection1.State = ConnectionState.Open Then
da.SelectCommand = New OleDbCommand(Query, OleDbConnection1)
da.SelectCommand.Connection = OleDbConnection1
da.SelectCommand.ExecuteNonQuery()
da.Fill(ds, NomeTbl)
da.FillSchema(ds, SchemaType.Mapped)
'se segui passo passo il codice vedrai che ora DeleteCommand,insertcommand
'e update command sono a NOTHING quindi devi valorizzarli
Dim CmbBld As New OleDb.OleDbCommandBuilder(da)
da.DeleteCommand = CmbBld.GetDeleteCommand
da.InsertCommand = CmbBld.GetInsertCommand
da.UpdateCommand = CmbBld.GetUpdateCommand
End If
Catch err As OleDbException
MsgBox(err.Message & " " & err.ErrorCode)
Finally
If OleDbConnection1.State = ConnectionState.Open Then OleDbConnection1.Close()
End Try
End Sub
Private Sub btPopola_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btPopola.Click
PopolaTabella("Select * from ArcImpiegati", "ArcImpiegati", "NomeFileDb")
'ora aggiungici il binding ai tuoi controlli sulla form
End Sub
Private Sub BtAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAdd.Click
da = OleDbDataAdapter1
ds = DsProva1
Dim row As DataRow
row = ds.Tables("ArcImpiegati").NewRow()
'in questo momento hai una row disconnessa della tua table in memoria ma su cui puoi lavorare
'ora qui sotto aggiungici i nomi dei tuoi campi e i tuoi dati
row.Item("Impiegato") = txtImpiegato.Text
row.Item("NumTelefono") = txtNumTel.Text
row.Item("Utente") = txtUtente.Text
ds.Tables("ArcImpiegati").Rows.Add(row)
'ora la riga e' stata aggiunta nella datatable in memoria non sul db..ado.net lavora in modalita
'disconnessa!
End Sub
Private Sub BtSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btSave.Click
da = OleDbDataAdapter1
Dim dt As DataTable
'ottiene una copia di tutte le modifiche apportate alla tabella "arcImpiegati"
dt = ds.Tables("ArcImpiegati").GetChanges
If Not IsNothing(dt) Then
'ORA HA AGGIORNATO CON LE MODIFICHE SUL TUO DB ACCESS!
da.Update(ds.Tables("ArcImpiegati"))
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub btRicerca_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btRicerca.Click
Dim ResultRow As DataRow()
ResultRow = DsProva1.Tables("ArcImpiegati").Select("Impiegato='Marco Verdi'")
txtPrestito.Text = ResultRow(0).Item("Prestito")
End Sub
End Class
mangzeus
09-04-2004, 14:29
Funziona grazie mille...mi uccidi se ti dico dove sbagliavo....grazie mille ma c'ero arrivato da solo stamattina....cmq se mi serve qualche altro consiglio ti posso chiedere???grazie ancora di tutto.
mangzeus
09-04-2004, 15:15
perfetto funziona tutto...ho provato a fare quello che mi hai detto con la listbox...adesso però quando premo sul pulsante popola mi riempie solo la list box e non più il datagrid...sul quale avevo fatto il binding al dataset...
Se non c'e' più il binding sul datagrid vuol dire che l'hai tolto o non viene eseguito,xchè puoi averli bindati entrambi anche sullo stesso campo.Controlla bene se c'e' il bind sul datagrid e,in caso affermativo,controlla passo passo l'esecuzione del codice a runtime..dai che ci siamo;)
mangzeus
10-04-2004, 13:38
perfetto ci sono ho fatto popolare singolarmente sia il datagrid che la listbox...io ho inserito l'evento per quando cambio la selezione sull'impiegato nella listbox...solo che appena seleziono un impiegato mi da un errore e non mi si posiziona sulla riga corrente...vedo come risolverlo da solo, forse è perchè avevo fatto il binding sia sulla list che sul datagrid sullo stesso evento e allora popolava solo la listbox...se non ci riesco ti posto l'errore, io cmq ho seguito quello che mi hai postato tu...grazie ancora per i mille consigli...perchè penso che se ho imparato come è il sistema dopo sarà molto più facile per me adattarlo ad altri programmi.
mangzeus
15-04-2004, 10:17
Public CurRow as DataRow
-crea un evento
ListBox1_SelectedIndexChanged
-mettici dento questa istruzione
CurRow=ListBox1.SelectedItem
Ora se hai eseguito una query del tipo "SELECT * FROM TABELLAIMPIEGATI" nella listbox dovresti la lista degli impiegati.
A ogni nuova selezione di un elemento nella ListBox viene attualizzata la riga corrente CurRow(ti evita le select di inizio post)
Ora che hai sempre la riga corrente tira dentro i controlli textbox o quant'altro che ti servono x visualizzare i dati di ciascun record e :
-o fai il binding come per la listbox
-o popoli a mano dentro la ListBox1_SelectedIndexChanged
TxtImpiegatoNAme.Text=CurRow.Item("Impiegato")
CkPrestito.Checked=CurRow.Item("Prestito") 'funzia se e' un campo BOOL
Direi che di + non posso fare
------------------------------------------------------------------------------------
geen mi dice cast non valido e si ferma a
CurRow=ListBox1.SelectedItem
cosa si ignifica??
Si e' vero,manchevolezza mia
Essendo bindata la Listbox ritorna un DataRowView e io ti ho fatto dichiarare CurRow come datarow.Nell'evento ListBox1_SelectedIndexChanged metti questo
Dim Row As Data.DataRowView
Row = LstDitte.SelectedItem
CurRow = Row.Row
e hai la riga corrente sulla tabella
(Cast non valido=sbagliato il tipo..Shift+F9 sulla variabile e vedi il tipo cosi ti accorgevi subito che stava tornando un valore non compatibile con la tua variabile CurRow ;) )
mangzeus
15-04-2004, 10:54
grazie mille di tutto sai???ti ho scritto anche sull'altra discussione tool bar...grazie mille di tutto...
mangzeus
16-04-2004, 08:14
Originariamente inviato da Geen
Di nulla:)
geen scusa se ti rompo ancora...volevo chiederti una cosina ancora...adesso ho fatto tutti i collegamenti...io nel mio programma uso 2 tabelle...come mi consigli di fare creo due dataset ogniuno per ogni tabella oppure due dataadapter diversi???in modo che il selectcommand,insertcommand,deletecommand siano di quella tabella...cioè volevo sapere se devo trascinare anche quella tabella nel form oppure se potevo utilizzare il dataset e il dataadapter della tabella che avevo già nel programma...
poi avevo intenzione di fare un collegamento tra le due tabelle...mi spiego meglio...
io quando inserisco un nuovo record nella tabella impiegati voglio scrivere nel campo "titolo" della tabella Libri dove il titolo del libro è uguale a quello del relativo Impiegato...cioè in tutte e due le tabelle c'è un campo Titolo solo che una è la tabella Libri e quell'altra la tabella Impiegati...volevo fare questo tipo di relazione...come posso fare...grazie ancora di tutto....
poi per modificare i dati di una intera riga senza aggiungerne una nuova devo usare il metodo edit del DataRow???grazie ancora di tutto...come sempre
Originariamente inviato da mangzeus
geen scusa se ti rompo ancora...volevo chiederti una cosina ancora...adesso ho fatto tutti i collegamenti...io nel mio programma uso 2 tabelle...come mi consigli di fare creo due dataset ogniuno per ogni tabella oppure due dataadapter diversi???in modo che il selectcommand,insertcommand,deletecommand siano di quella tabella...cioè volevo sapere se devo trascinare anche quella tabella nel form oppure se potevo utilizzare il dataset e il dataadapter della tabella che avevo già nel programma...
se entrambe le tabelle hanno campi che verranno modificati nell'esecuzione della form per ora puoi fare due dataAdapter,ciascuno con i command per una delle due tabella.
Se invece verrà modificata una sola tabella usa un solo dataadapter ed esegui il commandbuilder solo per la tabella interessata
Originariamente inviato da mangzeus
poi avevo intenzione di fare un collegamento tra le due tabelle...mi spiego meglio...
io quando inserisco un nuovo record nella tabella impiegati voglio scrivere nel campo "titolo" della tabella Libri dove il titolo del libro è uguale a quello del relativo Impiegato...cioè in tutte e due le tabelle c'è un campo Titolo solo che una è la tabella Libri e quell'altra la tabella Impiegati...volevo fare questo tipo di relazione...come posso fare...grazie ancora di tutto....
..qualche conto non mi torna..allora:
-e' stato inserito un nuovo record nella tabella impiegati
-vado a cercarmi nella tabella libi i record che hanno il campo titolo=a quello del nuovo record
-scrivo nel campo titolo della tabella libri.
Ho capito bene?Perche' non riesco a vedere un'applicazione di questo algoritmo..cmq farei cosi
finita la modifica mi creo una dataVIEW con un sottoinsieme della tabella libri(filtrata logicamente per il campo Titoli)
Dim dw As DataView
dw = New DataView(ds.Tables("ArcImpiegati"))
dw.RowFilter = "Titolo = '" & NewRow.Item("Titolo") & "'"
Originariamente inviato da mangzeus
poi per modificare i dati di una intera riga senza aggiungerne una nuova devo usare il metodo edit del DataRow???grazie ancora di tutto...come sempre
No..accedi a d ogni singolo campo e modificalo..BeginEdit/End Edit servono solo per sospendere la generazione di eventi legata alla modifica.
Viene usato nel caso di aggiornamenti di più righe in cui ogni singola riga scatena eventi che rallentano l'esecuzione e non sono necessari in quanto ne basterebbe l'esecuzione solo al termine dell'aggiornamento(tipico caso e' il popolamento di una listbox bindata che ha un evento selectindexchanged implementato)
mangzeus
19-04-2004, 09:09
Originariamente inviato da Geen
se entrambe le tabelle hanno campi che verranno modificati nell'esecuzione della form per ora puoi fare due dataAdapter,ciascuno con i command per una delle due tabella.
Se invece verrà modificata una sola tabella usa un solo dataadapter ed esegui il commandbuilder solo per la tabella interessata
..qualche conto non mi torna..allora:
-e' stato inserito un nuovo record nella tabella impiegati
-vado a cercarmi nella tabella libi i record che hanno il campo titolo=a quello del nuovo record
-scrivo nel campo titolo della tabella libri.
Ho capito bene?Perche' non riesco a vedere un'applicazione di questo algoritmo..cmq farei cosi
finita la modifica mi creo una dataVIEW con un sottoinsieme della tabella libri(filtrata logicamente per il campo Titoli)
Dim dw As DataView
dw = New DataView(ds.Tables("ArcImpiegati"))
dw.RowFilter = "Titolo = '" & NewRow.Item("Titolo") & "'"
No..accedi a d ogni singolo campo e modificalo..BeginEdit/End Edit servono solo per sospendere la generazione di eventi legata alla modifica.
Viene usato nel caso di aggiornamenti di più righe in cui ogni singola riga scatena eventi che rallentano l'esecuzione e non sono necessari in quanto ne basterebbe l'esecuzione solo al termine dell'aggiornamento(tipico caso e' il popolamento di una listbox bindata che ha un evento selectindexchanged implementato)
allora quello che intendevo io è questo: io ho 2 tabelle 1 impiegati e quell'altra libri...
1.Inserisco un nuovo record nella tabella impiegati con il nome dell'Impiegato e il titolo del libro....
2.nel momento in cui inserisco questo record voglio che automaticamente nella tabella libri, nel campo titolo, (nel campo titolo dove il titolo è = a quello che ho scritto nel nuovo record aggiunto dell'impiegato) voglio che venga scritto una qualsiasi cosa: ad esempio "si"...questo mi serve poi per verificare la disponibilità del libro o meno nela tabella libri...spero di essermi spiegato...
per quanto riguarda la modifica...io nel mio form per ogni riga corrente ho fatto il binding su delle textbox relative ad ogni campo...io quando visualizzo la riga corrente mi si riempiono tutte le textbox con i relativi campi e io voglio fare in modo che se uno vuole modificare quel determinato campo scriva dentro la textbox e con un pulsante il record venga modificato...pensavo si usasse edit e begin edit...c'è un metodo per fare questo...come edit e upgrade in vb6??
mangzeus
19-04-2004, 14:41
geen mi permetto di mandarti il mio programmino per email...ho fatto tutto quello che mi hai detto ma non mi funziona quando voglio aggiornare i dati sul database con la sub AggiornaDb...non mi viene neanche fuori l'errore...
allora sarà una stupidata cmq ti mando per email il mio programma che funziona la visualizzazione l'aggiungi ma non l'aggiorna...
o meglio io faccio sempre così
1lista libri, faccio click Visualizza Lista
2vado su tab gestione libri..
3aggiungo dei record
4torno su visualizza lista e faccio click aggiorna e mi da l'errore, per favore mi puoi trovare questo stupido errore perchè nell'esempio che mi avevi postato mi funziona e quì no e non capisco perchè...
poi sempre per via email se mi puoi rispondere all'ultimo post che ti ho mandato....con calma...grazie mille...
ti posto anche il database bibliox
andrea.chiarentin
16-11-2010, 13:15
Buongiorno a tutti,
ho trovato molto interessante questa discussione e mi è stata anche utile.
Ho incontrato solo un piccolo problema, il comando da.update non funziona nel caso di eliminazione delle righe dalla datatable. Riesco a rimuovere la riga dalla table ma al modifica non viene riportata sul db. L'unico modo di eliminare le righe è di farlo in modo diretto eseguendo un comando sql apposito.
Secondo voi quale potrebbe essere il problema?
Grazie per l'attenzione.
Saluti.
Andrea
Buongiorno a tutti,
ho trovato molto interessante questa discussione e mi è stata anche utile.
Ho incontrato solo un piccolo problema, il comando da.update non funziona nel caso di eliminazione delle righe dalla datatable. Riesco a rimuovere la riga dalla table ma al modifica non viene riportata sul db. L'unico modo di eliminare le righe è di farlo in modo diretto eseguendo un comando sql apposito.
Secondo voi quale potrebbe essere il problema?
Grazie per l'attenzione.
Saluti.
Andrea
Ok che è il tuo primo post, ma dal momento che hai tirato su una discussione del 2004 (:eek:) forse dovresti postare il codice che ti da problemi, descrivendo esattamente cosa vuoi ottenere e perchè non riesci ad ottenerlo.
Oltretutto ragazzi, usate questi benedetti tags [CODE] e l'indentazione, sennò viene il mal di mare, e passa anche la voglia di capire/interpretare/aiutare... :p
andrea.chiarentin
09-12-2010, 18:55
Qualcuno di voi sa per quale assurdo motivo non riesco a far riflettere la cancellazione di una riga dal dataset sul DB??
Premetto che tutto è fatto come dovrebbe essere è possibile che ci sia qualche bug nelle funzioni di vb?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.