18 messaggi dal 15 novembre 2013
problema volevo far si che quando salvo mi puliva tutti i campi (ma quello del codice creato con il metodo "codice" non lo pulisce e non genera neanche il codice nuovo(ho commentato dove sono le chiamate ai metodi)

Ho fatto il debug ma al momento della seconda chiamata il valore della variabile è sempre la stessa di prima non si è autoincrementata sebbene nel database sia stata memorizzata e se continuo a salvare il codice sulla textbox resta sempre quello mentre sul database si aggiorna.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data.OleDb;


namespace Orologeria
{
    public partial class InsBusta : Form
    {

    
        SqlCommand comando;
        SqlConnection conn;

        string constr =  @"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\Paolo\Dropbox\Programmazione\c#\Work\Orologeria\Orologeria\DataOrologeria.mdf;Integrated Security=True";

        public InsBusta()
        {
            InitializeComponent();
            
        }

        
        private void salvaButton_Click(object sender, EventArgs e)
        {
           

            conn = new SqlConnection(constr);
            comando = new SqlCommand();
            conn.Open();

        try
            {
           
            comando.Parameters.Add("@CB",SqlDbType.NVarChar).Value = codiceBustaTB.Text;
            comando.Parameters.Add("@CL", SqlDbType.NVarChar).Value = clienteCB.Text;
            comando.Parameters.Add("@DI", SqlDbType.Date).Value = dataAccDTP.Value;
            comando.Parameters.Add("@DC", SqlDbType.Date).Value = dataConsegnaDTP.Value;
            comando.Parameters.Add("@DO", SqlDbType.NVarChar).Value = descOggettiTB.Text ;
            comando.Parameters.Add("@LV", SqlDbType.NVarChar).Value = lavoriTB.Text;
            comando.Parameters.Add("@PC", SqlDbType.Float).Value = string.IsNullOrWhiteSpace(prezzoCTB.Text);
            comando.Parameters.Add("@PP", SqlDbType.Float).Value = string.IsNullOrWhiteSpace(prezzoPTB.Text);
            comando.Parameters.Add("@PPr", SqlDbType.Float).Value = string.IsNullOrWhiteSpace(prezzoPrecTB.Text);
            comando.Parameters.Add("@N", SqlDbType.NVarChar).Value = noteTB.Text;
           

            comando.Connection = conn;


            //sql Statement


            comando.CommandText = "Insert into bustaRiparazione (codiceBustaCliente,cliente,dataInserimento,dataConsegna,"+
                                  "descrizioneOggetti,lavoriDaEseguire,prezzoC,prezzoP,prezzoPreventivo,"+
                                  "note) values (@CB,@CL,@DI,@DC,@DO,@LV,@PC,@PP,@PPr,@N)";


          
               comando.ExecuteNonQuery();
               MessageBox.Show("Salvato");


                idBustaTB.Clear(); 
                codiceBustaTB.Clear();
                descOggettiTB.Clear();
                lavoriTB.Clear();
                prezzoCTB.Clear();
                prezzoPTB.Clear();
                prezzoPrecTB.Clear();
                noteTB.Clear();

              


            }
            catch(Exception err)
                {
                MessageBox.Show("Non Salvato"+err);
                }

            finally
            {

                conn.Close();
                this.codice();
            }

        

        }

        private void InsBusta_Load(object sender, EventArgs e)
        {
            // TODO: questa riga di codice carica i dati nella tabella 'dataSet11._clienti__'. È possibile spostarla o rimuoverla se necessario.
            this.clienti__TableAdapter.Fill(this.dataSet11._clienti__);
            // TODO: questa riga di codice carica i dati nella tabella 'dataSet1._clienti__'. È possibile spostarla o rimuoverla se necessario.
            this.clienti__TableAdapter.Fill(this.dataSet1._clienti__);


          
          
          
          
        }

        private void esciButton_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        //Metodo perche legge il record piu alto e ne incrementa di 1 il valore e lo trasmette
        //Alla TextBox
        private void codice()
        {

          DataClasses1DataContext db = new DataClasses1DataContext();
            var maxvalue = (from b in db.bustaRiparazione select b.IdBusta).Max()+1;
            Console.Write("Questo è il codice "+maxvalue);
            idBustaTB.Text = Convert.ToString(maxvalue);
            

            
                           
        }
            }
       }
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

nio74Maz ha scritto:

il valore della variabile è sempre la stessa di prima

Non saprei dire perché si comporta così ma possiamo ottimizzare il tuo codice e magari scoprire che il problema si è risolto da sé.

Eliminerei del tutto il metodo codice. Infatti non serve ricorrere ad un DataContext per ottenere l'Id del record che hai appena inserito.
Hai già aperto una connessione al database e dunque possiamo riciclare quella. Anzi, possiamo riciclare lo stesso comando INSERT perché, grazie alla clausola OUTPUT, puoi tirar fuori l'ID del record che cerchi.

Dunque modifica così il tuo comando.
comando.CommandText = "Insert into bustaRiparazione (codiceBustaCliente,cliente,dataInserimento,dataConsegna,"+
                                  "descrizioneOggetti,lavoriDaEseguire,prezzoC,prezzoP,prezzoPreventivo,"+
                                  "note) OUTPUT inserted.IdBusta+1 values (@CB,@CL,@DI,@DC,@DO,@LV,@PC,@PP,@PPr,@N)";

//Uso ExecuteScalar perché ora il comando restituisce un valore
idBustaTB.Text = comando.ExecuteScalar().ToString();


Comunque... qual è lo scopo per cui visualizzi all'utente l'ID del prossimo record?

ciao,
Moreno
Modificato da BrightSoul il 23 novembre 2013 19.00 -

Enjoy learning and just keep making
18 messaggi dal 15 novembre 2013
Ho risolto usando il metodo classico.
 public void codice()
            {
                DataClasses1DataContext db = new DataClasses1DataContext();

                var maxvalue = (from b in db.bustaRiparazione select b.IdBusta).Max() + 1;
                idBustaTB.Text = Convert.ToString(maxvalue);
                conn = new SqlConnection(constr);
                comando = new SqlCommand();
                conn.Open();

                comando.CommandText = "SELECT idBusta FROM [bustaRiparazione]"; ;
                comando.Connection = conn;
                using (var reader = comando.ExecuteReader())
                {
                    while (reader.Read())
                        idBustaTB.Text = reader["idBusta"].ToString();
                }
                
                

                conn.Close();
            }


Ora Leggendo il Manuale che ho acquistato(C# 5 - Guida completa per lo sviluppatore)Vorrei riscriverla tutta con Entity Framework, mi pare di capire che è uno standard di ultima generazione perciò pensavo di seguire piu questa filosofia che dite? troppo complicato?


OPs mi sono dimenticato di rispondere alla sua domanda,
Comunque... qual è lo scopo per cui visualizzi all'utente l'ID del prossimo record?


Volevo far si che all'inserimento venisse fuori in automatico il codice incrementato di uno in modo che l'utente non lo debba inserire lui,perchè io voglio che sia univoco.
Modificato da nio74Maz il 23 novembre 2013 19.23 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

nio74Maz ha scritto:

Vorrei riscriverla tutta con Entity Framework

Considera che riscrivere un'applicazione comporta un certo impegno. Se lo fai per motivi di studio va bene, e questa volta dovresti usare WPF al posto di WinForms, perché ti permetterà di eliminare molto del codice che hai attualmente.

Tutto il codice che viene definito di plumbing, cioè quello che ti serve a leggere/scrivere i valori nei rispettivi campi, te lo eviterai perché WPF dispone di un potente meccanismo di databinding.

Se invece si tratta di lavoro, molto probabilmente il tempo che investirai nella riscrittura dell'applicazione non sarà ripagato. Dato andresti a modificare solo le tecnologie usate senza aggiungere nuove funzionalità, rischierai solamente di compromettere o interrompere il buon servizio che l'attuale applicazione sta dando all'utente.

nio74Maz ha scritto:

Volevo far si che all'inserimento venisse fuori in automatico il codice incrementato di uno in modo che l'utente non lo debba inserire lui,perchè io voglio che sia univoco.

Allora non è necessario che il codice appaia lì, del resto quel valore neanche lo stai utilizzando nel comando INSERT. Se la chiave primaria idBusta è una colonna IDENTITY (e credo proprio che lo sia), sarà il database stesso ad autoincrementarne il valore e ad assicurasi che sia univoco.

nio74Maz ha scritto:

Ho risolto usando il metodo classico.

Rivedi il tuo codice perché in questo momento stai selezionando tutti gli ID, mentre a te serve leggere solo l'ultimo. Quel codice non è ottimizzato e il problema comincerà a farsi sentire quando nella tabella avrai molte migliaia di righe.
Oltretutto non hai usato la clausola ORDER BY e dunque non c'è garanzia che l'ultimo ID che ti viene restituito sia effettivamente quello più grande.

Dovresti usare la clausola OUTPUT come ti ho mostrato o evitare del tutto di mostrare l'ID all'utente perché, come abbiamo detto, non serve.

ciao,
Moreno
Modificato da BrightSoul il 23 novembre 2013 20.03 -

Enjoy learning and just keep making
18 messaggi dal 15 novembre 2013
Bello Wpf sto tentando di usare entity framework ma ho gia il mio primo errore

private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            using (var db = new DataOrologeriaEntities())
            {
                var b = new bustaRiparazione()
                {
                    codiceBustaCliente = "pincoPallino"

                };

                db.bustaRiparaziones.Add(b);
                db.SaveChanges();


e questo è l'errore

Eccezione di tipo 'System.Data.Entity.Validation.DbEntityValidationException' in EntityFramework.dll non gestita nel codice utente

Ulteriori informazioni: Convalida non riuscita per una o più entità. Per ulteriori dettagli, vedere la proprietà 'EntityValidationErrors'.


Puo essere un problema di password al database io uso l'autenticazione di windows
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

nio74Maz ha scritto:
Puo essere un problema di password al database

mmh, penso di no; l'eccezione DbEntityValidationException lascia intendere che il tuo oggetto bustaRiparazione non può essere salvato perché non ha superato la validazione. Questo succede, ad esempio, quando non indichi alcun valore per alcune proprietà obbligatorie.

Per il momento, se devi fare un test, prova a valorizzare tutte le proprietà dell'oggetto bustaRiparazione. Vedo infatti che tu hai valorizzato solo codiceBustaCliente.

Comunque tu puoi sapere con esattezza quali siano le proprietà che non hanno superato la validazione. Dovresti mettere l'istruzione dentro un try...catch per catturare l'eccezione DbEntityValidationException e consultare la sua proprietà EntityValidationErrors. Questa è una collezione di errori che si sono verificati durante la validazione e ti lasceranno capire quali siano i valori da correggere.

Ecco un esempio che ti mostra come leggere la collezione degli errori.
http://stackoverflow.com/questions/15820505/dbentityvalidationexception-how-can-i-easily-tell-what-caused-the-error#answer-19229994

ciao,
Moreno
Modificato da BrightSoul il 24 novembre 2013 17.44 -

Enjoy learning and just keep making
18 messaggi dal 15 novembre 2013
Era Colpa mia la stringa che inserivo era troppo lunga il campo doveva contenere al massimo 10. Grazie a tutti per la pazienza.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.