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. |