Newsgroup: it.comp.lang.visual-basic
Titolo: Dataadapter e comandi inviati al DB

Ciao.
Qualcuno ha una vaga idea di come può essere possibile che un comando di
questo tipo:
da.Update(dt.Select(Nothing, Nothing, DataViewRowState.Deleted))
Mandi più volte la stessa istruzione Update al database, anche se il
risultato di dt.Select è una sola riga?
Praticamente la riga sopra dovrebbe aggiornare il database inviandogli
un'istruzione delete per ogni riga che risulta eliminata nel datatable.
Se però l'eliminazione non va a buon fine (per esempio se la riga non può
essere eliminata a causa di vincoli), quando richiamo il da.Update su
un'altra riga (o anche sulla riga stessa) in realtà il comando UPDATE viene
inviato due volte. E se tento di eliminare sempre la stessa riga e quindi
ottengo nuovamente l'eccezione, gli update successivi mandano il comando TRE
volte ecc. ecc.
Ciao
Skysurfer

 da.Update(dt.Select(Nothing, Nothing, DataViewRowState.Deleted))
dt.Select
dalla guida
Ottiene una matrice di oggetti DataRow.
Elenco di overload
Ottiene una matrice di tutti gli oggetti DataRow.
giuseppeD

 Ottiene una matrice di tutti gli oggetti DataRow.
perdonami giuseppe, non ho capito quale sia il significato del tuo post, nel
contesto... il metodo select restituisce una matrice di datarow, il metodo
update, tra i vari overload, prevede la matrice di datarow come
parametro....
Dove sarebbe il problema, secondo te?
Salutoni
Sergio

 ha scritto nel messaggio
news:9SNra.38063$K35.1...@news2.tin.it...

Sì, lo so cosa fa dt.Select.
E infatti io sono sicuro che nel mio caso dt.Select(Nothing, Nothing,
DataViewRowState.Deleted) mi seleziona una sola riga (perchè ne ho solo una
eliminata nel datatable).
Ma il comando DELETE viene generato più volte dall'istruzione da.Update
(come ho già spiegato nel mio post precedente).
Ciao
Skysurfer

 ha scritto nel messaggio
news:b8obqi$bvf8t$1...@ID-173193.news.dfncis.de...

Ammetto di aver letto superficialmente il post,
ma sulla spiaggia in questa stagione va il mini tanga senza parte superiore,
e dopo aver osservato forme geometriche ben arrotondate giocare a racchetta
o ammirato le onde del mare, il rischio di connettere poco esiste.
Vediamo di recuperare.
Ho eseguito i seguenti test.
Caricato una griglia con sorgenti dati preso da un DataSet popolato da un
DataAdapter
Dopo conversione di tipo ho ottenuto un DataTable.
'Primo test
        dt.Rows(1).Delete()
        SqlDataAdapter1.Update(dt.Select(Nothing, Nothing,
DataViewRowState.Deleted))
'Cancellazione di una riga OK
''''''''''''''''''
'successivamente ho eseguito:
  dt.Rows(1).Delete()
        dt.Rows(3).Delete()
        dt.Rows(5).Delete()
        SqlDataAdapter1.Update(dt.Select(Nothing, Nothing,
DataViewRowState.Deleted))
'Cancellazione di tre righe OK
'''''''''''''''''''''''''''''''''''''
'Tentativo di eliminazione di riga inesistente
'Risposta da parte della gestione degli errori
"Nessuna riga alla posizione 6"
'non riesegue il codice
'''''''''''''''''''''''''''''''''''''
'Tentativo di eliminazione di un indice Key con relazione esterna
'Risposta del gestore delle eccezioni
"L'istruzione DELETE ha generato un conflitto con il vincolo COLUMN
REFERENCE 'FK_tblSocieta_tblNomi' nel database 'Northwind', tabella
'tblSocieta', column 'IDCliente'."
------------------
Quindi il problema capitato a Skysurfer
a me non si è presentato.
Sarebbe interessante conoscere il codice con cui popola il DataTable per un
tentativo di capire il perchè dell'anomalia.
giuseppeD


Se devo essere sincero il mio codice č un po' "incasinato". Nel senso che fa
parte di una classe generica per la gestione dei dati che supporta sia
connessioni Sql che OleDB, memorizza internamente i Command, genera i
comandi di Insert/Delete/Update con un CommandBuilder e altre cosine del
genere.
Quasi sicuramente faccio io qualche casino da qualche parte. Adesso provo a
"snellire" un po' il codice e vedo se riesco ad ottenere qualcosa di
postabile.
Ma tu come hai fatto a verificare che il comando non viene mandato piů volte
del necessario? Anche io alla fine, se controllo il Database trovo tutto
come dovrebbe essere, ma se metto un messageBox nell'evento RowUpdating del
dataAdapter vedo che lě dentro ci entra piů volte del dovuto.
Grazie e ciao.
Skysurfer

 dataAdapter vedo che lì dentro ci entra più volte del dovuto.
Nel primo post non è presente l'indicazione dell'utilizzo dell'evento
RowUpdating, e la differenza è notevole.
Comunque ho eseguito un test con l'aggiunta dell'evento come segue:
  Private Sub SqlDataAdapter1_RowUpdating(ByVal sender As Object, ByVal e As
System.Data.SqlClient.SqlRowUpdatingEventArgs) Handles
SqlDataAdapter1.RowUpdating
            Console.WriteLine(e.StatementType.ToString)
    End Sub
Rieseguito i test, nell'evento, presente l'eccezione o no, il passaggio è
uno solo.
La verifica è possibile con l'esecuzione delle istruzioni step dopo step, ed
anche nel riscontro nella finestra di Output del numero delle volte che
compare lo StatmentType
Salve
giuseppeD