Controllo dei dati

lunedì 06 aprile 2009 - 16.01

simbla79 Profilo | Junior Member

Ciao,

ho questo problema ho un dataset con diverse tabelle, ogni tabella ha il suo adapter con i comandi di insert, delete, update e select fatti da delle stored procedures. Le SP hanno all'interno la routin di controllo e ogninua ha la sua begin transaction e commit o rollback a seconda che non ci siano errori.

Il mio problema è questo quando inserisco i dati nelle tabelle del mio dataset e faccio il salvataggio chiamando i vari adapter.update se qualche valore non supera i controlli come faccio ad annullare l'intero inserimento? ovvero ad annullare i valori inseriti anche nelle altre tabelle?

Spero di essere stato chiaro
Ciao e grazie

Anonimo Profilo | Senior Member

1) Crea una stored procedure che di fatto chiama in sequenza tutte le altre stored prcedure degli adapter e a capo di questa metti una begin tran
2) Togli le transazioni dalle singole stored
3) a seconda dell'esito nella stored procedure primaria esegui un rollback o un commit

simbla79 Profilo | Junior Member

devo anche passare tutti i parametri delle altre SP giusto?

e poi modifico gli adapter per chiamare la sp che chiama tutto?

Anonimo Profilo | Senior Member

In realtà è meglio non usare un adapter ma richiamare una stored procedure direttamente, e cioè chiami la tua stored procedure principale una sola volta e ovviamente passi tutti i parametri che servono a tutte le stored procedure.

Ti postoun codice vecchio che avevo ma dovrebbe ancora essere utilizzabile al limite se becchi errori dimmelo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

simbla79 Profilo | Junior Member

Ciao,

perchè dici non è meglio usare un adapter? se hai altri suggerimenti fatti avanti.

Il mio problema è che utilizzo ul adapter perchè lui si prende incarico di eseguire update insert o delete cosa che io in questo momento non saprei come fare.


PS
Io utilizzo vb e non c

Anonimo Profilo | Senior Member

Non ti dico di non usare un adapter per aggiornare le tabelle e robe simili, ma per il caso specifico che hai segnalato, fatti la funzione e richiama una stored unica da codice e in quella stored metti la logica delle transazioni. La traduzione del codice che avevo postato in codice vb è immediata ma se hai difficoltà dimmelo che te la converto io.


simbla79 Profilo | Junior Member

>In realtà è meglio non usare un adapter ma richiamare una stored
>procedure direttamente, e cioè chiami la tua stored procedure
>principale una sola volta e ovviamente passi tutti i parametri
>che servono a tutte le stored procedure.

Stavo ripensando alla soluzione da te proposta ma non mi va bene xè i dati nelle tabelle posso inserirli in momenti diversi.
Esempio: TABELLA1 inserisco dei dati salvo e chiudo la form. Ricarico la form con i dati inseriti inserico i dati nella TABELLA2 salvo e chiudo.

Se ho un unico adapeter con un unica SP mi farà n insert anche nelle altre tabelle dove non devono essere fatte giusto?

Anonimo Profilo | Senior Member

Ah ok ora è tutto chiaro, bene segui i seguenti passi:

1) Tutti i salvataggi li fai su datatable temporanei che metti in sessione
2) Quando decidi di fare il commit prendi ogni tabella dalla sessione la confronti e la sincronizzi con i datatable reali su cui lavori
3) invii l'aggiornamento del datatable ufficiale
4) in caso di rollback svuoti i datatable in sessione

simbla79 Profilo | Junior Member

e per i controlli come ti dicevo?

avresti degli esempi?

Scusami se magari non mi sono spiegato bene

Anonimo Profilo | Senior Member

Molto semplice nel tuo codice aggiungi le righe:

Dim dsTemp as DataSet() = ds.copy(); Session["temporaneo"]=dsTemp;

Scrivile dove ritieni opportuno. Poi esegui tutte le operazioni sulle tabelle e lavori sempre su dstemp e non su ds, solo alla fine quando vuoi salvare tutti i tuoi dati scrivi:

if (Session["temporaneo"]!=null) ds = ((DataSet)Session["temporaneo"]);

e qui usi il codice che hai con gli adapter come prima, ma in questo modo hai filtrato l'operazione come se facessi una transazione perchè puoi svuotare la sessione quando vuoi (Session["temporaneo"]=null) e di fatto aver eseguito così un rollback.

simbla79 Profilo | Junior Member

sotto che namespace è session?

comunque non è un'applicazione web ma un winform session va bene comunque?

Anonimo Profilo | Senior Member

No non va bene, usa allora una variabile statica pubblica in una classe istanziata con il form principale dell'applicazione.

simbla79 Profilo | Junior Member

ti passo il mio codice dimmi se è quello che intendi tu.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Anonimo Profilo | Senior Member

No intendevo una cosa più semplice:

public class SessionWinForm { public static DataSet dsTemp; }

dal tuo form principale per memorizzare il dataset basta che fai

SessionWinForm.dsTemp=ds.copy();

In vb se non ricordo male la parola static diventa Shared e togli i punti e virgola per il resto dovrebbe andare bene.

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5