Newsgroup: it.comp.lang.visual-basic
Titolo: inserire un record sul dataset e update tramite data adapter

  Sto tentando di inserire un record su un dataset, secondo un esempio 
tratto da qui :
 
www.homeandlearn.co.uk/net/nets12p10.html
 
 
 
Esattamente cosi' :
 
 
   	Dim ds As New DataSet
 
         Dim nuovalinea As DataRow
 
         Dim sql As String
 
         connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data 
Source=D:\XDAT\neuropstat.mdb;"
         connection = New OleDbConnection(connetionString)
 
         sql = "SELECT * FROM Neuropaz "
 
         da = New OleDbDataAdapter(sql, connection)
 
         connection.Open()
 
 
         da.Fill(ds, "neuropaz")
 
 
         nuovalinea = ds.Tables("neuropaz").NewRow()
 
 
         nuovalinea.Item("Id_visita") = 3
         nuovalinea.Item("Id_esame") = 654
         nuovalinea.Item("PuntGrezzo") = 33
         nuovalinea.Item("PuntCorr") = 22
         nuovalinea.Item("PuntEquiv") = 24
         nuovalinea.Item("Data_visita") = "12/06/2008"
         nuovalinea.Item("Id_paziente") = 1763
         nuovalinea.Item("Seq_visita") = 4
         nuovalinea.Item("Seq_visita_N") = 2
         nuovalinea.Item("Patologia") = "COGLIONE"
         nuovalinea.Item("Data_nascita") = "12/12/1963"
         nuovalinea.Item("Scolarita") = 18
         nuovalinea.Item("Professione") = "PUSHER"
 
         ds.Tables("neuropaz").Rows.Add(nuovalinea)
 
         da.Update(ds, "neuropaz")
 
 
 
e ricevo il messaggio di errore :
 
"Update requires a valid InsertCommand when passed DataRow collection 
with new rows."
 
Neuropaz è un database creato a mano con Access e contiene solo un record.
Questo che sto creando dovrebbe essere il secondo record, ma non esce 
niente. Solo il messaggio di errore.
 
Dove sbaglio ???
 
Grazie per tutti i feedback.
 
John
 


 
http://www.dotnetspider.com/forum/9457-Please-Help-Error-Update-requires-valid-InsertCommand-passed-DataRow-collection-with-new-rows.aspx
 
 
 


 
 
l'ho provato in tutte le salse : aggiungendo  AccetChanges BeginEdit e 
EndEdit  in tutte le combinazioni di sequenza possibili e immaginabili. 
Alla fine ho trovato la sequenza che non mi da errore, ma non cambia 
nulla sul database.
 

 sul database.
 
 
When you use a DataTable and call the Update() method one of three things 
can happen:A row is added
A row is changed
A row is deleted
The adaptor needs to know how to do all these things but you have not told 
it how, thus the error;add 3 lines:
 
1.. OleDbCommandBuilder cb = new OleDbCommandBuilder(da);2.. 
da.UpdateCommand = cb.GetUpdateCommand();3.. da.InsertCommand = 
cb.GetInsertCommand(); 
 
 


 
Sì, tutto bello e perfetto (adesso andrò subito a provarlo) però nel 
link che avevi postato non l'ho trovato. Dov'è ??
 
Io ho trovato solo quello che avevo scritto, in un esempio scritto in 
una risposta...
 
 
Comunque grazie.  E' il CommandBuilder che fa la differenza, sembra.
 
Adesso vado ad approfondire le mie conoscenze sul Commandbuilder e a 
vedere a che ca§§o serve esattamente e qual'è la sua funzione veramente, 
perchè non mi è ancora chiaro del tutto.
Pemsavo che un DataAdapter avesse tante di quelle cose che bastavano per 
fare  Insert/Add/Delete/Update. Vado subito a vedere.
 
Grazie.
 
Buonanotte.
 
John.

 John.
Lo so che mi farò del male....ma io tutte le volte ci provo...
 
DATAADAPTER.....un ponte fra te che lavori in locale.... la base dati 
che sta chissà dove!
 
A che serve...a fare quello che ti ho appena detto...SVINCOLARE...la 
parte tua locale....con la parte remota che non ce ne frega dov'è!
 
COSA e' in concreto e BANALIZZANDO?
Un contenitore di 4 query:
una per selezionare i records
una per cancellarli
una per inserirli
Una per modificarli
 
ad ogni query corrisponde un metodo esplicito...per usarla se si desidera!
 
ORA....siccome l'interfaccia neuronale ancora non esiste.....il data 
adapter...NON ha di default valorizzate queste query...sa una sega lui 
che caz di tabella vuoi agganciare!!!!
 
Scendendo nel dettaglio devi anche capire che dotnet è una serie di 
mattoncini lego uno incastrato nell'altro:
LE "QUERY" in realtà sono degli oggetti COMMAND...che abbisognano....di 
una connessione al database (ECCO QUI IL PONTE)
 
quindi quando scrivi
 
DataAdapter.fill
o .update che succede???
 
 
Esempio fill
il dataadapter guarda se c'è un oggetto command agganciato alla casella 
SELECT....se c'è lo esegue....l'oggetto command cerca una 
connessione...se c'è l'apre...esegue la query...restituisce un reader al 
dataAdapter...il dataadapter usa questo reader per creare in memoria 
LOCALE un contenitore DATASET con dentro un oggetto DATATABLE (casomai 
con il nome che vuoi) che contiene un elenco (per poter essere scorso da 
LINQ ad esempio...o trattato comunque come una LISTA) di "righe" ch 
rappresentano un altra lista di colonne con il risultato della query.
 
 
Perchè NON ti rende un dataset con cursore alla VB6???
Me lo sono chiesto anche io....e maledetto parecchio M$!!!!
Alla fine credo di aver capito
 
il risultato non è sempre una tabella 1:1 potrebbe essere il risultato 
di query su più tabelle ed avere dei campi calcolati...ad esempio 
potrebbe essere una query/stored che estrapola i dati di un venditore 
dalle zone calcola l'incidenza per zona e calcola un rating
Avere un sistema a Liste
Lista di DATAROW
            ---->lista di datacolumn
 
mi rende semplice trattare i dati!
Vieppiù posso usare LINQ o trattare i dati come matrici....ossia avere 
UN UNICO MODO per leggere i dati...siano memorizzati in una matrice...o 
in un complesso database...casomai distribuito!!!!
 
VB6 ed ADO erano SPECIALIZZATI
dotNet è l'opposto cerca di essere GENERALISTA il più possibile: un 
unico modo di fare le cose...applicato a più contesti!
 
 
TORNANDO A NOI:
Al 99,(9)%
hai impostato la query per il select...e fill funziona
 
NON hai impostato query di update e insert...ed update non 
funziona!!!...e nemmeno insert!...
 
 
SALUTI!


TI RISEGNALO per l'ennesima volta la guida di totems lair...
 
usa VB.net
č gratis
USA MYSQL al posto del solito SQLserver
....usa esempi concreti....costruisci una vera app per i dati!..
E' abbastanza divertente leggerla
E una BASE DI PARTENZA OTTIMA...l'ho usata per dei corsi!
 
 
 
 
troveresti ad esempio
http://totemslair.org/guide/viewchapter.php?guida=vb&id=75
 
 
 
 
 
 
 
 
e dentro un bel...cito.....
"
Dim Conn As New MySqlConnection("Server=localhost; Database=appdata; 
Uid=root; Pwd=root;")
095.
Dim Adapter As New MySqlDataAdapter
096.
 
097.
'Un oggetto di tipo CommandBuilder genera automaticamente
098.
'tutti le istruzioni update, INSERT IGNORE e delete che servono
099.
'a un adapter per funzionare. Tali istruzioni vengono
100.
'generate relativamente alla tabella dalla quale si stanno
101.
'caricando i dati
102.
Dim Builder As MySqlCommandBuilder
103.
 
104.
Conn.Open()
105.
 
106.
Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Songs;", Conn)
107.
Builder = New MySqlCommandBuilder(Adapter)
108.
Adapter.Update(AppDataSet.Songs)
109.
 
110.
Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Authors;", Conn)
111.
Builder = New MySqlCommandBuilder(Adapter)
112.
Adapter.Update(AppDataSet.Authors)
113.
 
114.
Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Albums;", Conn)
115.
Builder = New MySqlCommandBuilder(Adapter)
116.
Adapter.Update(AppDataSet.Albums)
117.
 
118.
Conn.Clone()
..."