Dataset Update

lunedì 30 marzo 2009 - 12.32

simbla79 Profilo | Junior Member

Ciao,

mi servirebbe il vostro aiuto per capire un paio di cose.

Ho un oggetto dataset con 2 tabelle un è la testa dei dati (chiamata VNCCOUNTER) e la seconda i dettagli (VNCARTS).

La tabella di testa ha un campo contatore che non è autoincrementante ma lo valorizzo io manualmente facendo una select isnull(max(nome campo),0) + 1 where ... che chiamo VNCCNT

Nella seconda tabella ho il mio campo VNCCNT ed altri campi di dettaglio.

Ho creato 2 oggetti SqlDataAdapter con delle storedprocedure con i comandi per l'update delete insert e select.

Il mio problema è questo nella mia applicazione quando faccio un nuovo ordine vado ad inserire una riga nella tabella di testa e una in quella di dettaglio.
Dim cntRow As DataRow Dim artRow As DataRow cntRow = _ds.VNCCOUNTER.NewVNCCOUNTERRow cntRow("USRID") = curUser.UserId cntRow("VNCTYPE") = _tipo artRow = _ds.VNCARTS.NewVNCARTSRow artRow.SetParentRow(cntRow) _ds.VNCCOUNTER.Rows.Add(cntRow) _ds.VNCARTS.Rows.Add(artRow)

Come faccio a dirgli che numero avrà VNCCNT della tabella VNCARTS se il valore del "contatore" lo conosco solo dopo avere fatto la insert nella tabella VNCCOUNTER ma io però sul dataset le righe dei dati le inserisco simultaneamente?

Spero di essere stato chiaro.

Ciao e grazie

Anonimo Profilo | Senior Member

Mi spieghi perchè dici che le inserisci simultaneamente? di fatto la tabella 2 che è associata alla tabella 1 viene aggiornata se esiste un elemento sulla tabella 1 quindi fai una insert nella prima tabella e poi l'insert nella seconda. diversamente crei una stored procedure per gestire da codice il tutto, ma non cambia di molto il concetto.
Se no altra tecnica che si usa spesso è mettere un'id che non centra niente con il programma esempio 99999 e solo dopo aver eseguito i due insert fare gli update sulle tabelle per cambiare il 99999 con l'id corretto.

alexmed Profilo | Guru

Ciao
Sono di fretta, ma se ho capito il problema, prova a guardare SCOPE_IDENTITY()

http://technet.microsoft.com/it-it/library/ms190315.aspx

Ciao

alexmed

simbla79 Profilo | Junior Member

>Ciao
>Sono di fretta, ma se ho capito il problema, prova a guardare
>SCOPE_IDENTITY()
>
>http://technet.microsoft.com/it-it/library/ms190315.aspx
>
>Ciao
>
>alexmed

ciao e grazie per la risposta ma non è quello che intendevo io

simbla79 Profilo | Junior Member

>Mi spieghi perchè dici che le inserisci simultaneamente? di fatto
>la tabella 2 che è associata alla tabella 1 viene aggiornata
>se esiste un elemento sulla tabella 1 quindi fai una insert nella
>prima tabella e poi l'insert nella seconda. diversamente crei
>una stored procedure per gestire da codice il tutto, ma non cambia
>di molto il concetto.
>Se no altra tecnica che si usa spesso è mettere un'id che non
>centra niente con il programma esempio 99999 e solo dopo aver
>eseguito i due insert fare gli update sulle tabelle per cambiare
>il 99999 con l'id corretto.
>


ciao e grazie della tua risposta,

infatti mi sono spiegato male io, alla fine ho sistemato un pò di cose di qua e di la e sono riuscito.

Volevo chiederti però un'altra cosa. Io ho aggiunta alla prima tabella 1 riga ed alla seconda un'altra riga faccio l'update e sul db mi ritrovo le mie 2 belle righe.

Come faccio ad aggiungere dei controlli? Io in questo momento ho dei controlli all'interno delle storeprocedure per verificare se i campi necessari sono stati compilati ma mi succede questa cosa, faccio l'update della 1 tabella e tutto ok, faccio l'update della 2 tabella e c'è un problema come facio ad annullare le modifiche fatte anche alla 1 tabella?

Grazie ancora

Anonimo Profilo | Senior Member

devi iniziare una transazione:

http://msdn.microsoft.com/it-it/library/ms188929(SQL.90).aspx

e in caso di errore fai rollback nometransazione e lui riporta tutto com'era prima, se invece è tutto ok fai commit nometransazione e lui conferma le modifiche.

simbla79 Profilo | Junior Member

hai un modo più diretto per contattarti? msg o altro?

Anonimo Profilo | Senior Member


La leggo in tempo quasi reale 16 ore al giorno.

simbla79 Profilo | Junior Member

beh vedo che anche qui non è poi da meno

simbla79 Profilo | Junior Member

è già tutto in una transaction

ti invio parte di codice
Dim cmd As SqlCommand Dim cntIns As SqlCommand Dim artIns As SqlCommand Dim artUpd As SqlCommand cmd = New SqlCommand("USR_SP_SEL_VNCCOUNTER", oConnection) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@VNCNUM", SqlDbType.VarChar, 8).Value = _numero _adpCounter = New SqlDataAdapter(cmd) cntIns = New SqlCommand("USR_SP_INS_VNCCOUNTER", oConnection) cntIns.CommandType = CommandType.StoredProcedure cntIns.Parameters.Add("@VNCTYPE", SqlDbType.VarChar, 2, "VNCTYPE") cntIns.Parameters.Add("@USRID", SqlDbType.Int, 0, "USRID") _adpCounter.InsertCommand = cntIns _adpCounter.Fill(_ds, "VNCCOUNTER") cmd.CommandText = "USR_SP_SEL_VNCARTS" _adpArts = New SqlDataAdapter(cmd) artIns = New SqlCommand("USR_SP_INS_VNCARTS", oConnection) artIns.CommandType = CommandType.StoredProcedure artIns.Parameters.Add("@VNCNUM", SqlDbType.VarChar, 8, "VNCNUM") artIns.Parameters.Add("@ARTNAME", SqlDbType.VarChar, 24, "ARTNAME") artIns.Parameters.Add("@ARTDISE", SqlDbType.VarChar, 24, "ARTDISE") artIns.Parameters.Add("@ARTDESC", SqlDbType.VarChar, 30, "ARTDESC") artIns.Parameters.Add("@ARTQTA", SqlDbType.Decimal, 18, "ARTQTA") artUpd = New SqlCommand("USR_SP_UPD_VNCARTS", oConnection) artUpd.CommandType = CommandType.StoredProcedure artUpd.Parameters.Add("@VNCNUM", SqlDbType.VarChar, 8, "VNCNUM") artUpd.Parameters.Add("@ARTID", SqlDbType.Int, 0, "ARTID") artUpd.Parameters.Add("@ARTNAME", SqlDbType.VarChar, 24, "ARTNAME") artUpd.Parameters.Add("@ARTDISE", SqlDbType.VarChar, 24, "ARTDISE") artUpd.Parameters.Add("@ARTDESC", SqlDbType.VarChar, 30, "ARTDESC") artUpd.Parameters.Add("@ARTQTA", SqlDbType.Decimal, 18, "ARTQTA") _adpArts.InsertCommand = artIns _adpArts.UpdateCommand = artUpd _adpArts.Fill(_ds, "VNCARTS") _ds.AcceptChanges() cntIns.Dispose() artIns.Dispose() artUpd.Dispose() cmd.Dispose() End Sub

questi sono gli adapter poi le SP sono già dentro una transaction

Anonimo Profilo | Senior Member

Io proverei a metterlo nel codice t-sql, secondo me funziona meglio.

simbla79 Profilo | Junior Member

in che senso?

ti ripeto le storeprocedure che sono su server sono già all'interno di una transazione

Anonimo Profilo | Senior Member

Scusa avevo capito male usa allora leggi questo articolo può esserti utile:

http://msdn.microsoft.com/it-it/library/ms172152(VS.80).aspx

simbla79 Profilo | Junior Member

ho letto ma non ci ho capito molto e dove applicarlo nel mio caso.

Io utilizzo un dataset e le transaction sono gia utilizzate nell'istruzione sql una per la sp della insert nella prima tabella e un'altra per la sp che gestisce la seconda tabella
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