Newsgroup: it.comp.lang.visual-basic
Titolo: Aggiornare un DB da Dataset in .NET

Ciao a tutti,
ho bisogno di fare un metodo che, passato un DataSet, aggiorni il db.
Ho trovato vai esempi su MSDN ma tutti quanti richiedono una stringa SQL
per creare il DataAdapter.
Esiste un modo per farne a meno?
Ciao e grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Esiste un modo per farne a meno?
se non ricordo male, esiste un metodo per fare in modo che sia il data
adapter ad "autogenerare" la stringa sql, ma il risultato è piuttosto
"pesante".
la cosa migliore è farsi un comando sql ad hoc. non dovrebbe essere troppo
difficile.
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 difficile.
Dovrebbe essere il command builder ma per aprire il dataadapter chiede cmq
una select sulla tabella.
Cavolo mi pare impossibile, si poteva fare in VB6 non vedo perchè in .NET
non ci sia il verso.
Grazie cmq.


 .NET non ci sia il verso.
in vb6 come facevi ad aprire la tabella?
che difficoltà c'è nel fare un select campo1, [....], campon from tabella?


 per creare il DataAdapter.
Siccome ci ho perso un sacco di tempo a mia volta per capire come funziona
ADO.NET
 provo a darti una sintetica sequenza della cosa (che qualcuno dica
se sbaglio eh?)
DATABASE
|
dataadapter (qui devi indicare la stringa SQL "SELECT .....")
|
dataadapter.fill => dataset
((lavori sul dataset))
dataadapter.update(dataset) => DATABASE
Ora, perché il metodo "update" del dataadapter funzioni, devi inserire
tale riga:
Dim custCB As OleDbCommandBuilder = New OleDbCommandBuilder(dataAdapter1)
L'oggetto che così vai a creare, costruisce automaticamente le strighe SQL
di cui ha bisogno il dataadapter per aggiornare il database originale; su
MSDN trovi anche la descrizione di come fare se vuoi fare le stringhe a
mano...
Io ho anche cercato di utilizzare le stringhe SQL per modificare il
dataset, quindi senza utilizzare datarow.beginedit() ecc... però non ho
capito come fare (anche se credo si possa), se qualcuno lo sa è gradita
una spiegazione :-)
Sono stato sintetico, ma spero di averti chiarito un po' le idee.


 Esiste un modo per farne a meno?
Il DataAdapter usa la SELECT nel caso in cui associ un CommandBuilder al DA.
Il CB usa questa select per farsi un giro sul server e reperire le info
relative ai campi usati e costruisce i relativi comandi di update, insert
into e delete.
Poi facendo DA.Update in questo caso vengono usati questi comandi per
aggiornare il DB.
Il CB ha un (secondo me grosso) limite: almeno uno dei campi nella select
devono definire un indice univoco per il record, altrimenti si limita ad
andare in errore.
Altrimenti anzichč usare il CB assegni direttamente al DA i vari comandi SQL
e poi fai l'Update.
Ciao

 Ciao e grazie
Vi ringrazio a tutti però forse non sono stato chiaro.
Nell'applicazione che sto facendo ho creato una struttura logica tale da
isolare la logica del DB dalla logica dell'applicazione.
Per questo motivo avevo bisogno di creare un metodo che, passato un
dataset, ne facesse l'update sul DB.
Mi spiego meglio........
Facciamo il caso d'avere una tabella che si chiama "tabella1" con un tot
di campi.
Poi 2 metodi di elaborazione su DB, uno che si chiama queryGet(sql) e uno
che si chiama queryPut(dataset) (che è quello che voglio terminare).
A questo punto faccio un metodo nello strato di logica dell'applicazione
che si chiama "tabella1put" che viene usato da un aspx per inserire nella
tabella i dati provenienti da un form.
Questo metodo farà "dataset = queryGet(sql)" (in realtà c'è un ulteriore
livello che astrae anche l'SQL ma non è indicativo per fare l'esempio) ed
ottiene un dataset con una riga che rappresenta i dati del form dell'aspx.
Io vorrei poter aggiornare i dati del dataset con i nuovi dati provenienti
dal form e poi dare tutto il dataset in pasto alla "queryPut(dataset)" che
lo aggiorna al db.
Questa cosa la faceva in VB6 con i recordset e mi sembra impossibile che
non si possa fare in .NET.
Vi prego aiutatemi ma grazie cmq.
Ciao a tutti.


 non si possa fare in .NET.
Non ho capito qual è il problema nell'utilizzo di DA.Update()
Ciao

 Ciao
Per DA intendi DataAdapter vero?
Il problema è che per crearlo ho bisogno di un SQL e io voglio creare un
metodo che non abbia bisogno di tale sql.


 metodo che non abbia bisogno di tale sql.
Te l'ho detto: non sei costretto a dargli questa SQL, ma sei costretto a
dargli un comando SQL valido per i comandi di insert, update e delete.
Io adesso per pigrizia mi sono appoggiato al commandbuilder che si ciuccia
la SELECT del DA, e per questa SELECT uso questa (forse è questo il tuo
problema):
        Public Shared Function ToString(ByVal tabella As DataTable) As
String
            Dim str As String = "SELECT "
            For Each dc As DataColumn In tabella.Columns
                str += dc.ColumnName + ","
            Next
            Return str.Substring(0, str.Length - 1) + " FROM " +
tabella.TableName
        End Function
Ciao