Ricerca 
it-ITen-US
Registrazione
Accedi
In-Vesti Dotnetwork
IN-VESTI DNW!!!
Sono finalmente arrivate le nuovissime T-Shirt di DotNetWork!!! Con soli 15,00 € ci sosterrai nelle spese di gestione della Community e ti invieremo a casa una splendida maglietta.
Se vuoi contribuire al mantenimento di DotNetWork.it Vai sulla pagina Iscrizioni
Effettua il pagamento usando IWBank
Click per andare alla pagina di Iscrizione
Oppure un Bonifico bancario (le coordinate sono sulla pagina Iscrizioni), inviaci una mail a support@dotnetwork.it indicandoci la tua taglia e l'indirizzo di spedizione.  Non appena verificata la ricezione del pagamento provvederemo a spedirti la tua T-Shirt.  Le magliette sono disponibili nelle taglie S-M-L-XL-XXL (in caso di esaurimento di una delle taglie, indica quella di "Backup"). Grazie per IN-VESTIRTI con NOI!!!
.:DotNetWork Founders:.
    Stampa     


DotNetWork Forums
nidificare connessione a DB tra metodi con transazione
Ultimo Post 21 giu 2010 13.18 by Panatronic. 1 Risposte.
Stampa immediata
Ordina:
PrevPrev ProssimoProssimo
Non sei autorizzato ad inviare una risposta.
Autore Messaggi

Posts:537

--
21 giu 2010 12.16  
Buongiorno a tutti.
Ho un problema sicuramente capitato a molti di voi: devo semplicemente registrare una fattura su un DB Access, quindi prima registrare la testata e poi i dettagli.
Ho un metodo che richiama due altri metodi: RegistraTSFattura e RegistraDettaglio.
Questi due metodi richiamano dalla Dll Panatronic.Base.Data il metodo ExecCommand a cui passo la stringa di connessione e i vari parametri.
Per chi non lo sapesse il metodo ExecCommand non fa altro che creare una connessione ed eseguire una query passatagli con i parametri: una semplice ExecuteNonQuery().
Ora il mio problema è: e se succede qualche errore nella registrazione dei dettagli (ma anche altrove) mi ritrovo la fattura registrata ma non giusta.
A questo punto ho pensato di usare una transazione, quindi ho fatto una OleDbTansaction all'inizio di tutto e cioè nel metodo "SalvaFattura"...e poi ho modificato il comando ExecCommad passandogli la connessione che sti trova nella transazione al posto della stringa di connessione.
A questo punto ho:
Primo Metodo:
//creo la transazione
OleDbTransaction mMyTransaction;
//Declare and Instantiate connection
OleDbConnection cn = null; cn = new OleDbConnection(mCnStr); cn.Open();
//Start transazione su connessione mMyTransaction= cn.BeginTransaction();
 try
{
 FatturazioneHelper.RegistraNuovaFattura(cn,txtIntestazione.Text, txtPIva.Text, txtCF.Text.ToUpper(), txtIndirizzo.Text, txtCitta.Text, mAnno, mDataFattura); mMyTransaction.Commit();
 }
 catch (Exception ex)
{
 mTrans.Rollback();
 }
 di conseguenza il metodo RegistraNuovaFattura è questo:
 
public static int RegistraNuovaFattura(OleDbConnection pCn, string pIntestazione, string pPIva, string pCF, string pIndirizzo, string pCitta, int pAnno, DateTime pDataFattura)
 {
 try
 {
 string CmSql = "INSERT INTO TbFatture (NumeroFattura, DataFattura, Intestazione, PIva, CF, Indirizzo, Citta, Anno) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; int numeroFattura = NNuovaFattura(pAnno);

OleDbParameter[] param = new OleDbParameter[]
{
 new OleDbParameter("@NumeroFattura",numeroFattura), new OleDbParameter("@DataFattura",pDataFattura),
 new OleDbParameter("@Intestatario",pIntestazione),
new OleDbParameter("@PIva",pPIva),
new OleDbParameter("@CF",pCF),
new OleDbParameter("@Indirizzo",pIndirizzo),
new OleDbParameter("@Citta",pCitta),
new OleDbParameter("@Anno",pAnno)
 };
 ExecCommand(pCn, CmSql, System.Data.CommandType.Text, param);
string SqlQuery = "SELECT Max(IDFattura) FROM TbFatture";
return (int)AccessExecHelper.ExecScalar(mCnStr, SqlQuery, System.Data.CommandType.Text, null);
}
catch (Exception ex)
{
 throw new ApplicationException(System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
}
 }
 
in questo metodo viene usato il metodo ExecCommand che è questo: public static void aExecCommand(OleDbConnection pCn, string pCommandText, CommandType pCommandType, OleDbParameter[] pOleDbParameters)
{
 try
 {
 OleDbCommand cmd = new OleDbCommand(); cmd.CommandText = pCommandText;
if (pOleDbParameters != null)
{
 cmd.Parameters.AddRange(pOleDbParameters);
}
 cmd.CommandType = pCommandType; cmd.Connection = pCn; cmd.ExecuteNonQuery();
}
 catch (Exception ex)
{
 throw new ApplicationException(System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
}
}
 tutto questo non funziona. mi da un errore strano e dice: ExecuteNonQuert richiede che il comando abbia una transazione quando la connessione assegnata al comando è in una transazione locale in sospeso. La proprietà Transaction del comando non è stata inizializzata.

grazie.

Posts:537

--
21 giu 2010 13.18  
Risolto:

dovevo passare anche la transazione al metodo che eseguiva l'ExecNonQuery e collegarla al OleDbCommand.

Grazie Giorgio.
Non sei autorizzato ad inviare una risposta.

Active Forums 4.1
       
Articoli
Fritto Misto - Classi di uso comune(parte 3)
Helper: Due interfacce per implementare classi Entity
2007/10/22 | Autore: Sabrina Cosolo
Panoramica delle Proprietà Subordinate (Dependency Properties)
Come iniziare a capire WPF Parte 6
2007/11/22 | Autore: Patrizia Cosolo
Stampare Una DatagridView
Come utilizzare gli oggetti di stampa forniti dal framework per stampare il contenuto di una DatagridView con l'ausilio della GDI+
2008/12/07 | Autore: Andrea Zingoni
Programmer Paster Addin per Expression Web 1 e 2
Implementare un Addin per Expression Web 1 e 2 che usa la libreria ProgrammerPaster
2009/02/26 | Autore: Rudy Azzan
SQL Server 2000/2005 Manutenzione Database
Uso di DBCC ShowContig e di sys.dm_db_index_physical_stats
2007/08/05 | Autore: Sabrina Cosolo
Assembly Strong Named
Firma digitale degli Assembly, uso e funzionalità
2007/08/05 | Autore: Sabrina Cosolo
Icone e Toolstrip
Icone della giusta dimensione e Toolstrip modificate a runtime
2009/06/28 | Autore: Sabrina Cosolo
Bitmap, GDI+,Collezioni,Classi
Classi e oggetti per usare la GDI+ per disegnare delle forme.
2009/06/06 | Autore: Sabrina Cosolo
    Stampa     
Home|Forums|Blogs|Mappa del sito
© 2007-2010 by DotNetWork  .:.  Condizioni d'uso  .:.  Privacy  .:.  Accedi  .:.