Aiuto

mercoledì 26 maggio 2010 - 19.11

antomaronc Profilo | Newbie

ciao, io dovrei fare un progetto, ma siccome sono davvero scarso non riesco purtroppo a fare funzionare l'insert(parlo di asp.net). Infatti scrivendo il mio codice:
string connessione = "la mia stringa di connessione";
SqlConnection c2 = new SqlConnection(connessione);
string stringSQL2 = "Insert into Capi (cod_ident_capo,tipo_capo,servizio,stato) values ('" + cod_ident_capo + "','" + tipo_capo + "','" + servizio + "','" + stato + "') ";
SqlCommand cmd = new SqlCommand(stringSQL2, c2);
c2.Open();
SqlDataReader reader = cmd.ExecuteReader();
gridViewLavanderia.DataSource = reader;
gridViewLavanderia.DataBind();
reader.Close(); //Chiude il "resul set"
c2.Close();

mi dice: "Violazione del vincolo PRIMARY KEY 'PK_Capi'. Impossibile inserire la chiave duplicata nell'oggetto 'dbo.Capi'."

Naturalmente il valore che gli passo come chiave non è già stato utilizzato, ma nonostante ciò mi da chiave duplicata:( sapresti aiutarmi???

alx_81 Profilo | Guru

>ciao, io dovrei fare un progetto, ma siccome sono davvero scarso
>non riesco purtroppo a fare funzionare l'insert(parlo di asp.net).
Ciao, c'è un po' di confusione..
Andiamo per passo:

>string stringSQL2 = "Insert into Capi (cod_ident_capo,tipo_capo,servizio,stato)
>values ('" + cod_ident_capo + "','" + tipo_capo + "','" + servizio + "','" + stato + "') ";
Questa è una cosa da non fare mai, altrimenti sei esposto ad attacchi di tipo SQL Injection (per maggiori info leggi qui http://www.dotnethell.it/articles/SQL-Injection-Tutorial-Security.aspx)

sostituisci con:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

questa è la sintassi di una query definita come PARAMETRICA (notare che i parametri sono definiti con il carattere @ davanti.
devi quindi definire i parametri in questo modo:

cmd.Parameters.AddWithValue("p_cod_ident_capo", cod_ident_capo); cmd.Parameters.AddWithValue("p_tipo_capo", tipo_capo); cmd.Parameters.AddWithValue("p_servizio", servizio); cmd.Parameters.AddWithValue("p_stato", stato);

in questo modo hai mappato il tuo parametro con la variabile che prima usavi per la concatenazione della stringa. E sei protetto da attacchi.

> SqlDataReader reader = cmd.ExecuteReader();
> gridViewLavanderia.DataSource = reader;
> gridViewLavanderia.DataBind();
> reader.Close(); //Chiude il "resul set"
perchè fai un reader (lettore di dati) e lo imposti come sorgente di un items container (la griglia) se fai solo insert? è inutile, usa invece ExecuteNonQuery (http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlcommand.executenonquery(VS.80).aspx) e aggiungi la gestione dell'errore con try catch (http://msdn.microsoft.com/en-us/library/0yd65esw(VS.71).aspx):

try { cmd.ExecuteNonQuery (); } catch (Exception ex) { Response.Write(String.Format("Errore: {0}", ex.Message)); }

Siccome poi la connessione ha anche bisogno di dispose, ti consiglio questa sintassi finale che fa la dispone in automatico (libera la memoria occupata dall'oggetto):

using (SqlConnection c2 = new SqlConnection ("tua connstring")) { c2.Open(); using (SqlCommand cmd = new SqlCommand(stringSQL2, c2)) { try { cmd.Parameters.AddWithValue("p_cod_ident_capo", cod_ident_capo); cmd.Parameters.AddWithValue("p_tipo_capo", tipo_capo); cmd.Parameters.AddWithValue("p_servizio", servizio); cmd.Parameters.AddWithValue("p_stato", stato); cmd.ExecuteNonQuery(); } catch (Exception ex) { Response.Write(String.Format("Errore: {0}", ex.Message)); } c2.Close(); } }

>mi dice: "Violazione del vincolo PRIMARY KEY 'PK_Capi'. Impossibile
>inserire la chiave duplicata nell'oggetto 'dbo.Capi'."
>Naturalmente il valore che gli passo come chiave non è già stato
>utilizzato, ma nonostante ciò mi da chiave duplicata:( sapresti
>aiutarmi???
questo è perchè facevi l'execute reader (e la query veniva lanciata la prima volta) e poi fai la DataBind (ovvero rilancia la query).. Due volte, la seconda è violazione di PK.


--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5