Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: Transaction

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    162

    Transaction

    Salve, mi è successa una cosa strana ho fatto un progetto con asp.net 2.0 express edition 2005 e come database ho usato access 2000.

    Questo progetto consiste nel inserire dei dati nel database in una specifica tabella.Naturalemnte questo progetto è in rete quindi più persone possono lavorare contemporaneamente!

    Dopo un giorno intero di lavoro dove stavano lavorando 2 persone, e inserito circa 600 dati,quando vado a vedere il database mi accorgo che mancano dei dati,ma soprattuto che al contatore della tabella saltava il numero progressivo(119,120,121....139,140,ect..);

    Non capisco come mai secondo Voi c'è bisogno di una transaction?

  2. #2
    Non capisco come mai secondo Voi c'è bisogno di una transaction?
    Direi proprio di si.
    Volendo potresti anche fare una verifica se effettivamente sia stata salvato il documento subito dopo il salvataggio, in modo da avvertire subito l'utente del problema...
    Qualcuno forse ti consiglierebbe anche di cambiare Access.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    162
    Purtroppo non posso cambiare il database, per causa forza maggiore.Io l'ho fatto presente,mi è stato risposto di no!

    Si per quanto riguarda l'avvertimento lo fa lui tramite la transazione,all'interno del try e catch con il Rollback!

    Però volevo aggiungere che io ho lavorato sia con MYsql e SqlServer 2005 e in nessuno dei due casi non ho mai fatto uso delle transaction in questo caso di insert, al massimo nella select dove un utente poteva prendere lo stesso record!

    Cmq volevo sapere da te se il codice che ho postato io è esatto:

    codice:
     
    
      OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Inetpub\\wwwroot\\DataEntry\\App_Data\\DataEntry1.mdb");
            OleDbCommand cm = new OleDbCommand();
            OleDbTransaction transaction = null;
            cm.Connection = conn;
          
            if(this.DataExpression(this.Data.Text.Trim())==true)
                
                        {
                
                if (CheckPhone(telefono.Text.ToString()) != false)
                {
    
                    if (Nominativo.SelectedItem.Text.Trim() != "" && Campagna.SelectedItem.Text != "" && Vendita.SelectedItem.Text.Trim() != "" && REC.SelectedItem.Text.Trim() != "")
                    {
    
                        try
                        {
                            conn.Open();
                
                            transaction = conn.BeginTransaction();
                            cm.Connection = conn;
                            cm.Transaction = transaction;
                     
                            cm.CommandText = "INSERT INTO Operazioni(Data,oper,nominativo,campagna,vendita,telefono,rec,extrafile,recuperato,caricato)VALUES(@Data,@oper,@nominativo,@campagna,@vendita,@telefono,@rec,@extrafile,@recuperato,@caricato)";
                            cm.Parameters.AddWithValue("@Data", Data.Text.ToString());
                            cm.Parameters.AddWithValue("@oper", OP.Text.ToString());
                            cm.Parameters.AddWithValue("@nominativo", Nominativo.Text.ToString());
                            cm.Parameters.AddWithValue("@campagna", Campagna.Text.ToString());
                            cm.Parameters.AddWithValue("@vendita", Vendita.Text.ToString());
                            cm.Parameters.AddWithValue("@telefono", telefono.Text.ToString());
                            cm.Parameters.AddWithValue("@rec", REC.Text.ToString());
                            cm.Parameters.AddWithValue("@extrafile", extrafile.Text.ToString());
                            cm.Parameters.AddWithValue("@recuperato", recuperato.Text.ToString());
                            cm.Parameters.AddWithValue("@caricato", Session["uname"].ToString());
                                                 
                            cm.ExecuteNonQuery();
                            transaction.Commit();
                            Errori.Text = "Dato Inserito Correttamente";
                            Data.Text = "";
                            OP.Text = "";
                            Nominativo.SelectedItem.Text= "";
                            Campagna.SelectedItem.Text = "";
                            Vendita.SelectedItem.Text = "";
                            telefono.Text = "";
                            REC.SelectedItem.Text = "";
                            extrafile.SelectedItem.Text = "";
                            recuperato.SelectedItem.Text = "";
    
                        
                        }
                        catch (Exception er)
                        {
    
                            Errori.Text=er.Message + er.StackTrace + er.Source;
                            
                            try
                            {
    
                                transaction.Rollback();
                                 
    
                            }
                            catch (Exception err)
                            {
                             
                             Errori.Text="Spiacente ma il documento non è stato inserito.Riprova"+ " " +  err.Message + err.Source + err.StackTrace;
                             Data.Text = "";
                             OP.Text = "";
                             Nominativo.SelectedItem.Text = "";
                             Campagna.SelectedItem.Text = "";
                             Vendita.SelectedItem.Text = "";
                             telefono.Text = "";
                             REC.SelectedItem.Text = "";
                             extrafile.SelectedItem.Text = "";
                             recuperato.SelectedItem.Text = "";
    
                            }
                        }
                        finally
                        {
                            conn.Close();
                           
    
                        }
                       
    
    
                    }
                    else
                    {
    
                        Errori.Text="I Campi Nominativo,Campagna,Vendita e REC sono campi Vuoti";
    
                    }
    
    
    
                }
                else
                {
    
                    Errori.Text="Il Campo Telefono deve iniziare con lo 0";
    
                }
            }
            else
            {
    
                Errori.Text = "Spiacente ma il Formato data non è corretto";
    
    
            }
    
            conn.Close();
                     
    }
    Grazie ancora

  4. #4
    A primo sguardo avresti dovuto mettere(secondo me):
    codice:
    if cm.ExecuteNonQuery()>0 Then
           transaction.Commit()
    Else
           transaction.Rollback()
    End if
    Come hai scritto tu esegue il Rollback solo se c'è stata un'eccezione catturata con il Try-Catch.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    162
    Cmq provandolo in locale(prova molto stupida) mi ha funzionato simulando un errore che non aveva niente a che fare con l'inserimento multiplo;
    Però il primo Try/catch ci vuole perchè analizza la connessione al db e l'inserimento nel db;
    Quindi come dici tu sarebbe così:

    codice:
     OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Inetpub\\wwwroot\\DataEntry\\App_Data\\DataEntry1.mdb");
            OleDbCommand cm = new OleDbCommand();
            OleDbTransaction transaction = null;
            cm.Connection = conn;
          
            if(this.DataExpression(this.Data.Text.Trim())==true)
                
                        {
                
                if (CheckPhone(telefono.Text.ToString()) != false)
                {
    
                    if (Nominativo.SelectedItem.Text.Trim() != "" && Campagna.SelectedItem.Text != "" && Vendita.SelectedItem.Text.Trim() != "" && REC.SelectedItem.Text.Trim() != "")
                    {
    
                        try
                        {
                            conn.Open();
                
                            transaction = conn.BeginTransaction();
                            cm.Connection = conn;
                            cm.Transaction = transaction;
                     
                            cm.CommandText = "INSERT INTO Operazioni(Data,oper,nominativo,campagna,vendita,telefono,rec,extrafile,recuperato,caricato)VALUES(@Data,@oper,@nominativo,@campagna,@vendita,@telefono,@rec,@extrafile,@recuperato,@caricato)";
                            cm.Parameters.AddWithValue("@Data", Data.Text.ToString());
                            cm.Parameters.AddWithValue("@oper", OP.Text.ToString());
                            cm.Parameters.AddWithValue("@nominativo", Nominativo.Text.ToString());
                            cm.Parameters.AddWithValue("@campagna", Campagna.Text.ToString());
                            cm.Parameters.AddWithValue("@vendita", Vendita.Text.ToString());
                            cm.Parameters.AddWithValue("@telefono", telefono.Text.ToString());
                            cm.Parameters.AddWithValue("@rec", REC.Text.ToString());
                            cm.Parameters.AddWithValue("@extrafile", extrafile.Text.ToString());
                            cm.Parameters.AddWithValue("@recuperato", recuperato.Text.ToString());
                            cm.Parameters.AddWithValue("@caricato", Session["uname"].ToString());
    
                            if (cm.ExecuteNonQuery() > 0)
                            {
                                transaction.Commit();
                                Errori.Text = "Dato Inserito Correttamente";
                                Data.Text = "";
                                OP.Text = "";
                                Nominativo.SelectedIndex = 0;
                                Campagna.SelectedIndex = 0;
                                Vendita.SelectedIndex = 0;
                                telefono.Text = "";
                                REC.SelectedIndex = 0;
                                extrafile.SelectedIndex = 0;
                                recuperato.SelectedIndex = 0;
    
                            }
                            else
                            {
    
                                transaction.Rollback();
                              
    
                            }
                        }
                        catch (Exception er)
                        {
    
                            Errori.Text=er.Message + er.StackTrace + er.Source;
      Errori.Text = "Spiacente ma il documento non è stato inserito.Riprova" + " " + er.Message + er.Source + er.StackTrace;
                                Data.Text = "";
                                OP.Text = "";
                                Nominativo.SelectedIndex = 0;
                                Campagna.SelectedIndex = 0;
                                Vendita.SelectedIndex = 0;
                                telefono.Text = "";
                                REC.SelectedIndex = 0;
                                extrafile.SelectedIndex = 0;
                                recuperato.SelectedIndex = 0;
                                                           }
                            
                      finally
                        {
                            conn.Close();
                           
    
                        }
                       
    
    
                    }
                    else
                    {
    
                        Errori.Text="I Campi Nominativo,Campagna,Vendita e REC sono campi Vuoti";
    
                    }
    
    
    
                }
                else
                {
    
                    Errori.Text="Il Campo Telefono deve iniziare con lo 0";
    
                }
            }
            else
            {
    
                Errori.Text = "Spiacente ma il Formato data non è corretto";
    
    
            }
    
            conn.Close();
                     
    
            }
    Giusto?

  6. #6
    Però il primo Try/catch ci vuole perchè analizza la connessione al db e l'inserimento nel db;
    Infatti, non ho detto che non ci voleva il Try-Catch.
    Giusto?
    Si

  7. #7
    Il codice che hai postato non e' corretto per vari motivi. Crea inutilmente una transaction. Gestisce male gli errori. Valorizza in maniera non tipizzata i parametri rischiando di avere problemi con il formato delle date. Usa n condizioni if una dentro l'altra rendendo difficile la gestione del codice. E' rischioso per il modo in cui istanzia e chiude la connection.
    Quindi, fermo restando che una transazione esplicita si usa quando devi eseguire piu' comandi sql e se uno dei comandi fallisce devono fallire tutti ma non e' il tuo caso visto che fai un unico comando di insert, una possibile soluzione migliorativa potrebbe essere:

    codice:
    OleDbConnection conn = null; 
            try
            {
                if (this.DataExpression(this.Data.Text.Trim()) == true)
                    throw new ArgumentException("Spiacente ma il Formato data non è corretto");
                if (CheckPhone(telefono.Text.ToString()) != false)
                    throw new ArgumentException("Il Campo Telefono deve iniziare con lo 0");
                if (Nominativo.SelectedItem.Text.Trim() != "" && Campagna.SelectedItem.Text != "" && Vendita.SelectedItem.Text.Trim() != "" && REC.SelectedItem.Text.Trim() != "")
                    throw new ArgumentException("I Campi Nominativo,Campagna,Vendita e REC sono campi Vuoti");
    
                conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Inetpub\\wwwroot\\DataEntry\\App_Data\\DataEntry1.mdb");
                conn.Open();
                OleDbCommand cm = conn.CreateCommand();
                cm.CommandText = "INSERT INTO Operazioni(Data,oper,nominativo,campagna,vendita,telefono,rec,extrafile,recuperato,caricato)VALUES(@Data,@oper,@nominativo,@campagna,@vendita,@telefono,@rec,@extrafile,@recuperato,@caricato)";
                cm.Parameters.Add("@Data", OleDbType.Date).Value = DateTime.Parse(Data.Text.ToString());
                cm.Parameters.Add("@oper", OleDbType.Integer).Value = int.Parse(OP.Text.ToString());
                cm.Parameters.Add("@nominativo", OleDbType.VarChar).Value = Nominativo.Text.ToString();
                // altri parametri...
                cm.ExecuteNonQuery();
                // codice necessario prima di uscire
                Errori.Text = "Dato Inserito Correttamente";
                return true;
            }
            catch (OleDbException exOledb)
            {
                Errori.Text = exOledb.Message + " " + exOledb.StackTrace + " " + exOledb.Source;            
            }
            catch (Exception ex)
            {
                Errori.Text = ex.Message;
            }
            finally
            {
                if(conn != null)
                    conn.Close();
            }
    Saluti a tutti
    Riccardo

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    162
    Caro riccardone, ti ringrazio per il tuo utilissimo intervento,ma ti voglio ricordare che non essendo esperto di ASp.NET 2.0 e soprattutto della coppia ASP.NET 2.0-access ho chiesto aiuto a Voi del forum:

    Salve, mi è successa una cosa strana ho fatto un progetto con asp.net 2.0 express edition 2005 e come database ho usato access 2000.
    Questo progetto consiste nel inserire dei dati nel database in una specifica tabella.Naturalemnte questo progetto è in rete quindi più persone possono lavorare contemporaneamente!

    Dopo un giorno intero di lavoro dove stavano lavorando 2 persone, e inserito circa 600 dati,quando vado a vedere il database mi accorgo che mancano dei dati,ma soprattuto che al contatore della tabella saltava il numero progressivo(119,120,121....139,140,ect..);

    Non capisco come mai secondo Voi c'è bisogno di una transaction?
    Dove appunto chiedevo delle informazioni al riguardo!
    CMQ sto imparando grazie anche a Voi del forum e Vi chiedo solo un pò di pazienza, anche se mi sento abbastanza fiero del fato che ho creato un programma per un aziedna con questo linguaggio che ho preso in mano per la prima volta solo 20 giorni fa!

    Grazie ancora

  9. #9
    Originariamente inviato da sanfra1976
    ...ti voglio ricordare che non essendo esperto di ASp.NET 2.0 e soprattutto della coppia ASP.NET 2.0-access ho chiesto aiuto a Voi del forum:
    ...
    Dove appunto chiedevo delle informazioni al riguardo!
    mah... non capisco il perche' di questa osservazione. Peraltro, mi fa sorridere che ti riferisci ad una entita' astratta "voi del forum". Aggiungo che le osservazioni che ti ho fatto, non centrano nulla con access in particolare. Sono errori che si fanno soprattutto all'inizio. Quelli che ti ho segnalato sono i piu' evidenti ma non e' da sottovalutare ad es. un'altro errore (ma tanto si dice che... basta che vadi) come quello di legare una funzione di inserimento nel db con l'interfaccia utente senza suddividere bene i livelli magari concentrando la logica di accesso ai dati in una classe o in una libreria apposita.
    Il cliente che usa la tua applicazione fatta dopo 20 giorni magari non si accorge di nulla... o magari no.
    Saluti a tutti
    Riccardo

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    20

    Calma, calma

    Credo che Riccardone abbia ragione, ad esempio, io programmo per hobby e mi ha fatto piacere vedere il codice corretto da uno che probabilmente ci lavora 10 ore al giorno. Questo mi da la possibilità di capire alcune cose che nei libri mi risultano incomprensibili.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.