+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Valore chiave primaria duplicato

  1. #1
    L'avatar di Psycho
    Psycho non è in linea Scolaretto
    Sono 2 giorni che non riesco a capire dove stà l'errore.
    Quando provo a fare l'insert mi dice: 23505 un valore chiave duplicato viola il vincolo univoco "tbl_composizione_pkey"

    Ma in debug mode analizzando il DataGridView all'interno ci sono 2 o più record TOTALMENTE diversi... non hanno manco un campo uguale...anche sostituendo il DatagridView con altra fonte dati avente 2 o più record, niente sempre errore.

    Ho fatto tutte le prove più assurde ma niente, ricreato le tabelle, cambiato database (sempre postgresql ma su altro server), cambiato pc...
    La cosa stranissima che la stessa routine di codice la uso in altri progetti e funziona tranquillamente, sempre passandogli il DataGridView, mai avuto problemi.


    public void Insert_Fitosanitario(DataGridView DataGridComposizione)
            {
                Conn = new NpgsqlConnection();
                Conn.ConnectionString = Str_conn;
                Conn.Open();
    
                NpgsqlTransaction pgTransaction = Conn.BeginTransaction();
                try
                {
                    NpgsqlCommand pgCommand = new NpgsqlCommand();
    
                    string Insert_Query_Fitosanitari = "INSERT INTO " + TabellaFito + " (id_fitosanitario, descrizione_fitosanitario, tipologia_fitosanitario, classe_fitosanitario, distributore_fitosanitario, scheda_fitosanitario, percorsoscheda_fitosanitario, note_fitosanitario) VALUES (@Id, @Descrizione, @Tipologia, @Classe, @Distributore, @Scheda, @Percorsoscheda, @Note)";
    
                    string Insert_Query_Composizione = "INSERT INTO " + TabellaComposizione + " (id_composizione, idprodotto_composizione, idprincipio_composizione, principio_composizione, um_composizione, quantita_composizione, note_composizione) VALUES (@Id, @IdProdotto, @IdPrincipio, @Principio, @Um, @Quantita, @Note)";
                    
                    pgCommand.Connection = Conn;
                    pgCommand.Transaction = pgTransaction;
    
                    pgCommand.CommandText = Insert_Query_Fitosanitari;
    
                    pgCommand.Parameters.Add("@Id", NpgsqlDbType.Varchar, 30).Value = Id_Fitosanitario;
                    pgCommand.Parameters.Add("@Descrizione", NpgsqlDbType.Varchar, 150).Value = Descrizione_Fitosanitario;
                    pgCommand.Parameters.Add("@Tipologia", NpgsqlDbType.Varchar, 150).Value = Tipologia_Fitosanitario;
                    pgCommand.Parameters.Add("@Classe", NpgsqlDbType.Varchar, 50).Value = Classe_Fitosanitario;
                    pgCommand.Parameters.Add("@Distributore", NpgsqlDbType.Varchar, 150).Value = Distributore_Fitosanitario;
                    pgCommand.Parameters.Add("@Scheda", NpgsqlDbType.Varchar, 50).Value = Scheda_Fitosanitario;
                    pgCommand.Parameters.Add("@Percorsoscheda", NpgsqlDbType.Varchar, 250).Value = Percorsoscheda_Fitosanitario;
                    pgCommand.Parameters.Add("@Note", NpgsqlDbType.Varchar, 250).Value = Note_Fitosanitario;
    
                    pgCommand.ExecuteNonQuery();
    
                    foreach (DataGridViewRow CurrentRow in DataGridComposizione.Rows)
                    {
                        pgCommand.CommandText = Insert_Query_Composizione;
    
                        Id_Composizione = Utility.Genera_ID();  //////funzione che mi genera un ID UNICO personalizzato. 
                        
                        pgCommand.Parameters.Add("@Id", NpgsqlDbType.Varchar, 30).Value = Id_Composizione;
                        pgCommand.Parameters.Add("@IdProdotto", NpgsqlDbType.Varchar, 30).Value = Id_Fitosanitario;
                        pgCommand.Parameters.Add("@IdPrincipio", NpgsqlDbType.Varchar, 30).Value = DataGridComposizione.Rows[CurrentRow.Index].Cells[2].Value.ToString();
                        pgCommand.Parameters.Add("@Principio", NpgsqlDbType.Varchar, 200).Value = DataGridComposizione.Rows[CurrentRow.Index].Cells[3].Value.ToString();
                        pgCommand.Parameters.Add("@Um", NpgsqlDbType.Varchar, 10).Value = DataGridComposizione.Rows[CurrentRow.Index].Cells[4].Value.ToString();
                        pgCommand.Parameters.Add("@Quantita", NpgsqlDbType.Numeric).Value = DataGridComposizione.Rows[CurrentRow.Index].Cells[5].Value.ToString();
                        pgCommand.Parameters.Add("@Note", NpgsqlDbType.Varchar, 250).Value = DataGridComposizione.Rows[CurrentRow.Index].Cells[6].Value.ToString();
    
                        pgCommand.ExecuteNonQuery();
                    }
    
                    pgTransaction.Commit();
    
                    Conn.Close();
                    Conn.Dispose();
                }
                catch (Exception ex)
                {
                    pgTransaction.Rollback();
                    MessageBox.Show(ex.Message);
                    throw;
                }
            }
    
    Forse sto diventando davvero vecchio o il caldo... ma giuro che sto sclerando di brutto.

    GRAZIE per l'interesse
    ℹ️ Leggi di più su Psycho ...

  2. #2
    L'avatar di Cteniza
    Cteniza non è in linea Amanuense
    Presumo dalle istruzioni che usi che il database che hai sia postgresql.
    Credo che il problema sia proprio nella chiave univoca personalizzata.
    Prova a mettere al suo posto (per prova se vuoi) un campo di tipo sequence e genera il trigger che lo calcola
    ℹ️ Leggi di più su Cteniza ...

  3. #3
    L'avatar di Psycho
    Psycho non è in linea Scolaretto
    Quote Originariamente inviato da Cteniza Visualizza il messaggio
    Presumo dalle istruzioni che usi che il database che hai sia postgresql.
    Credo che il problema sia proprio nella chiave univoca personalizzata.
    Prova a mettere al suo posto (per prova se vuoi) un campo di tipo sequence e genera il trigger che lo calcola
    Ciao Cteniza e grazie dell'interesse.

    Si utilizzo postgresql.
    L'id personalizzato non è altro che una stringa di 16 numeri e ti posso assicurare che non è mai uguale, tipo un Timestamp.

    Ho persino passato un DataTable al posto del DataGridView, con all'interno 2 record creati con tutti i 7 campi diversi, quindi senza utilizare l'id personalizzato, ma nonostante ciò mi torna sempre lo stesso errore.

    Se elimino la chiave primaria dalla tabella incriminata mi ritrovo il primo record memorizzato 2 volte, quindi clonato e del secondo niente.

    Arrivato a sto punto posso provare a re-istanziare di nuovo il command nel foreach.

    Provo e ti faccio sapere

    GRAZIE

    PS: Per piacere puoi modificare il titolo del thred?? Invece di "Valore chiave duplicato primaria " doveva eesere "Valore chiave primaria duplicato " per la fretta ho invertito le parole

    GRAZIE
    ℹ️ Leggi di più su Psycho ...

  4. #4
    L'avatar di bumm
    bumm non è in linea Topo di biblioteca Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Presumo che DataGrdid non c'entra niente. Prova a controllare se Utility.Genera_ID() genera effettivamente un id univoco.
    L'altra cosa strana: Gli ID del prodotto da dove arrivano?
    ℹ️ Leggi di più su bumm ...

  5. #5
    L'avatar di Psycho
    Psycho non è in linea Scolaretto
    Utility.Genera_ID sono sicuro al 1000x1000 che generi ID unici, ma come ho scritto ho provato a passargli un DataTable con 2 record con tutti i campi diversi, quindi baypassando Genera_ID ed ho sempre lo stesso errore.

    L'ID del prodotto lo prende dalla tabella "madre", ovvero è il campo che hanno in comune la tabella madre e la tabella figlia.

    Ovviamente come dicevo sopra facendo una prova a re-istanziare il command va....

    public void Insert_Fitosanitario(DataGridView DataGridComposizione)
            {
                Conn = new NpgsqlConnection();
                Conn.ConnectionString = Str_conn;
                Conn.Open();
    
                NpgsqlTransaction pgTransaction = Conn.BeginTransaction();
                try
                {
                    NpgsqlCommand pgCommand = new NpgsqlCommand();
    
                    string Insert_Query_Fitosanitari = "INSERT INTO " + TabellaFito + " (id_fitosanitario, descrizione_fitosanitario, tipologia_fitosanitario, classe_fitosanitario, distributore_fitosanitario, scheda_fitosanitario, percorsoscheda_fitosanitario, note_fitosanitario) VALUES (@Id, @Descrizione, @Tipologia, @Classe, @Distributore, @Scheda, @Percorsoscheda, @Note)";
    
                    string Insert_Query_Composizione = "INSERT INTO " + TabellaComposizione + " (id_composizione, idprodotto_composizione, idprincipio_composizione, principio_composizione, um_composizione, quantita_composizione, note_composizione) VALUES (@Id, @IdProdotto, @IdPrincipio, @Principio, @Um, @Quantita, @Note)";
                    
                    pgCommand.Connection = Conn;
                    pgCommand.Transaction = pgTransaction;
    
                    pgCommand.CommandText = Insert_Query_Fitosanitari;
    
                    pgCommand.Parameters.Add("@IdgsqlDbType.Varchar, 30).Value = Id_Fitosanitario;
                    pgCommand.Parameters.Add("@DescrizionegsqlDbType.Varchar, 150).Value = Descrizione_Fitosanitario;
                    pgCommand.Parameters.Add("@TipologiagsqlDbType.Varchar, 150).Value = Tipologia_Fitosanitario;
                    pgCommand.Parameters.Add("@ClassegsqlDbType.Varchar, 50).Value = Classe_Fitosanitario;
                    pgCommand.Parameters.Add("@DistributoregsqlDbType.Varchar, 150).Value = Distributore_Fitosanitario;
                    pgCommand.Parameters.Add("@SchedagsqlDbType.Varchar, 50).Value = Scheda_Fitosanitario;
                    pgCommand.Parameters.Add("@PercorsoschedagsqlDbType.Varchar, 250).Value = Percorsoscheda_Fitosanitario;
                    pgCommand.Parameters.Add("@NotegsqlDbType.Varchar, 250).Value = Note_Fitosanitario;
    
                    pgCommand.ExecuteNonQuery();
    
                    foreach (DataGridViewRow CurrentRow in DataGridComposizione.Rows)
                    {
                        
                        pgCommand = new NpgsqlCommand();
                        pgCommand.Connection = Conn;
                        pgCommand.Transaction = pgTransaction;
    
                        pgCommand.CommandText = Insert_Query_Composizione;
    
                        Id_Composizione = Utility.Genera_ID();  //////funzione che mi genera un ID UNICO personalizzato. 
                        
                        pgCommand.Parameters.Add("@IdgsqlDbType.Varchar, 30).Value = Id_Composizione;
                        pgCommand.Parameters.Add("@IdProdottogsqlDbType.Varchar, 30).Value = Id_Fitosanitario;
                        pgCommand.Parameters.Add("@IdPrincipiogsqlDbType.Varchar, 30).Value = DataGridComposizione.Rows[CurrentRow.Index].Cells[2].Value.ToString();
                        pgCommand.Parameters.Add("@PrincipiogsqlDbType.Varchar, 200).Value = DataGridComposizione.Rows[CurrentRow.Index].Cells[3].Value.ToString();
                        pgCommand.Parameters.Add("@UmgsqlDbType.Varchar, 10).Value = DataGridComposizione.Rows[CurrentRow.Index].Cells[4].Value.ToString();
                        pgCommand.Parameters.Add("@QuantitagsqlDbType.Numeric).Value = DataGridComposizione.Rows[CurrentRow.Index].Cells[5].Value.ToString();
                        pgCommand.Parameters.Add("@NotegsqlDbType.Varchar, 250).Value = DataGridComposizione.Rows[CurrentRow.Index].Cells[6].Value.ToString();
    
                        pgCommand.ExecuteNonQuery();
                    }
    
                    pgTransaction.Commit();
    
                    Conn.Close();
                    Conn.Dispose();
                }
                catch (Exception ex)
                {
                    pgTransaction.Rollback();
                    MessageBox.Show(ex.Message);
                    throw;
                }
            }
    
    Ma non riesco a capacitarmi... è normale una cosa del genere?? forse ora è corretto??
    ℹ️ Leggi di più su Psycho ...

  6. #6
    L'avatar di bumm
    bumm non è in linea Topo di biblioteca Ultimo blog: [VB2010] ComboBox ed Enumeratori
    STOP, non ho proprio fatto caso che usi lo stesso oggetto command. Questo è il problema. Prova a settare la query e aggiungere i parametri fuori dal ciclo, mentre nel ciclo dovresti settare solo i valori. Command.Parameters.Add() aggiunge un nuovo parametro alla collezione. Cioè dopo ogni iterazione del ciclo avrai un uncremento pari al numero di parametri, es 1:7,2:14,3:21 e cosi via(in realta gia si spacca alla seconda iterazione) quindi non è la strada giusta.
    Ricapitolando:
    Fuori dal ciclo fai : Command.Parameters.Add()
    Nel ciclo:Command.Parameters["@nomeParametro"].Value = "pippo";
    ℹ️ Leggi di più su bumm ...

  7. #7
    L'avatar di Psycho
    Psycho non è in linea Scolaretto
    Quote Originariamente inviato da bumm Visualizza il messaggio
    STOP, non ho proprio fatto caso che usi lo stesso oggetto command. Questo è il problema. Prova a settare la query e aggiungere i parametri fuori dal ciclo, mentre nel ciclo dovresti settare solo i valori. Command.Parameters.Add() aggiunge un nuovo parametro alla collezione. Cioè dopo ogni iterazione del ciclo avrai un uncremento pari al numero di parametri, es 1:7,2:14,3:21 e cosi via(in realta gia si spacca alla seconda iterazione) quindi non è la strada giusta.
    Ricapitolando:
    Fuori dal ciclo fai : Command.Parameters.Add()
    Nel ciclo:Command.Parameters["@nomeParametro"].Value = "pippo";
    Faccio una prova subito e faccio sapere.

    GRAZIE
    ℹ️ Leggi di più su Psycho ...

  8. #8
    L'avatar di Psycho
    Psycho non è in linea Scolaretto
    Ho fatto la prova ed ovviamente funziona perfettamente!!

    il commandText

    pgCommand.CommandText = Insert_Query_Composizione;
    
    lo lascio dentro o fuori dal foreach?

    Resta comunque il mistero del perchè su dei vecchi progetti funziona senza darmi quell'errore.

    Grazie mille
    ℹ️ Leggi di più su Psycho ...

  9. #9
    L'avatar di bumm
    bumm non è in linea Topo di biblioteca Ultimo blog: [VB2010] ComboBox ed Enumeratori
    il commando lo metterei fuori, visto che non cambia.

    Per il resto, hai capito qual'èra il problema?
    l'oggetto command deve avere la collezione di parametri pari ai numeri di parametri. Per come l'hai fatto dopo ogni iterazione avresti il numero di parametri incrementato. qiondi se inizialmente hai 7 parametri, dopo 2 iterazioni: 14, dopo 3 iterazioni : 21 e cosi via.


    Tutto questo tecnicamente ti permette di fare l'insert in caso il tuo id e autoincrementato dal motore del db, ma è da evitare assolutamente, in quanto e un modo sbagliato.
    ℹ️ Leggi di più su bumm ...

  10. #10
    L'avatar di Psycho
    Psycho non è in linea Scolaretto
    Quote Originariamente inviato da bumm Visualizza il messaggio
    il commando lo metterei fuori, visto che non cambia.

    Per il resto, hai capito qual'èra il problema?
    l'oggetto command deve avere la collezione di parametri pari ai numeri di parametri. Per come l'hai fatto dopo ogni iterazione avresti il numero di parametri incrementato. qiondi se inizialmente hai 7 parametri, dopo 2 iterazioni: 14, dopo 3 iterazioni : 21 e cosi via.
    Si si capito dove sta il problema, anche se mi chiedo ancora come faccia a funzionare nei vecchi progetti.
    Alla fine era un errore pure abbastanza semplice/grossolano da individuare... ma leggevo e rileggevo...

    Quote Originariamente inviato da bumm Visualizza il messaggio
    Tutto questo tecnicamente ti permette di fare l'insert in caso il tuo id e autoincrementato dal motore del db, ma è da evitare assolutamente, in quanto e un modo sbagliato.
    Come dicevo sopra non uso l'id autoincrementato dal motore del db, ma uso una funzione che genere degli ID unici, anche in questo caso è un modo sbagliato?

    GRAZIE mille del preziosissimo aiuto.
    ℹ️ Leggi di più su Psycho ...

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Aggiornamento Chiave Primaria
    Da Maverick03 nel forum Visual Basic .Net
    Risposte: 8
    Ultimo Post: 23-04-2018, 13:29
  2. chiave primaria
    Da raphael9999 nel forum Microsoft Access
    Risposte: 1
    Ultimo Post: 17-04-2015, 17:31
  3. [SyBase]Modificare valore di una chiave primaria in un database
    Da nunzio nel forum Altri Database Server
    Risposte: 0
    Ultimo Post: 01-11-2010, 21:30
  4. Access creazione chiave primaria
    Da Squalo10 nel forum Microsoft Access
    Risposte: 4
    Ultimo Post: 28-02-2007, 14:37
  5. Problema Chiave Primaria
    Da Shark nel forum Microsoft Word
    Risposte: 3
    Ultimo Post: 15-10-2004, 22:03