PDA

View Full Version : C# - query INSERT INTO non dà errori ma non inserisce il record


luca1293
31-08-2012, 15:44
Buonasera a tutti,

premetto che sono nuovo nel campo della programmazione in C#. Mi è stato dato da fare un progetto che consiste nella gestione di un database con un'applicazione creata in c#. Utilizzo Visual Studio Express 2010 e SQL Server Express 2008.

Il problema sta nel fatto che l'esecuzione della query Insert, pur non dando errori, non mi inserisce all'interno del Database (chiamato Database1.mdf) i dati recuperati dalla form.

Ecco il codice:

private void cmdinsutente_Click(object sender, EventArgs e)
{

string connString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database1.mdf;Integrated Security=True;User Instance=True";

SqlConnection conn = new SqlConnection(connString);

try
{
string codice = txtcod.Text;
string nome = txtnome.Text;
string cognome = txtcognome.Text;
string login = txtlogin.Text;
string pass = txtpass.Text;
string admin = cboadmin.Text;
string query = "INSERT INTO Utenti (Codice_Utente, Nome, Cognome, Login, Password, Administrator) VALUES (@codice, @nome, @cognome, @login, @pass, @admin)";
SqlCommand insert = new SqlCommand(query, conn);

insert.Parameters.AddWithValue("@codice", codice);
insert.Parameters.AddWithValue("@nome", nome);
insert.Parameters.AddWithValue("@cognome", cognome);
insert.Parameters.AddWithValue("@login", login);
insert.Parameters.AddWithValue("@pass", pass);
insert.Parameters.AddWithValue("@admin", admin);

conn.Open();
insert.ExecuteNonQuery();
}

catch (SqlException errore)
{
Console.WriteLine("Error: " + errore);
}
finally
{
conn.Close();
string message = "Vuoi continuare ad inserire utenti?";
string caption = "Form di richiesta";
var result = MessageBox.Show(message, caption, MessageBoxButtons.YesNo);
if (result == System.Windows.Forms.DialogResult.No)
{
this.Close();
}
else
{
txtcod.Text = "";
txtnome.Text = "";
txtcognome.Text = "";
txtlogin.Text = "";
txtpass.Text = "";
cboadmin.Text = "";
}
}

}
Cosa è sbagliato? Come risolvere il problema?

Grazie del vostro aiuto,

Luca.

idoido
31-08-2012, 15:54
non ho visual studio sotto mano per fare delle prove, ma per prima cosa io controllerei la struttura della tabella, da come hai inserito i parametri i campi sono tutti varchar? la dimensione massima è abbastanza grande da contenere i valori che hai messo nella maschera?
hai una chiave primaria su quella tabella?

luca1293
31-08-2012, 19:01
allora:
1) la tabella ha una primary key nel campo Codice_Utente.
2) alcuni campi non sono varchar, ma come fare per modificare il tipo? Anziché string mettere int o simili?
3) in che senso "la dimensione massima è abbastanza grande da contenere i valori che hai messo nella maschera"?

Grazie della risposta :)

idoido
31-08-2012, 19:09
allora:
1) la tabella ha una primary key nel campo Codice_Utente.
2) alcuni campi non sono varchar, ma come fare per modificare il tipo? Anziché string mettere int o simili?
3) in che senso "la dimensione massima è abbastanza grande da contenere i valori che hai messo nella maschera"?

Grazie della risposta :)
1) che tipo di primary key? magari hai impostato un int autoincrementale ad esempio
2) esatto, se il campo è un int, la variabile che assegni al @parametro deve essere di tipo int
3) es: campo varchar di lunghezza 5 (codice postale) e il valore della variabile è 001122 (lunghezza 6)

luca1293
31-08-2012, 22:45
la primary key non è di tipo incrementale... si tratta di un semplice int assegnato al campo Codice_Utente. Riguardo invece la lunghezza dei varchar non ho impostato nulla, perciò non credo sia quel tipo di problema!! :muro:

Riguardo invece la conversione da stringa ad intero ho usato questa dichiarazione: "int x = Int32.Parse(myTextBox.Text);" ... quindi anche se dopo tengo lo stesso @parametro che avevo prima non mi dovrebbe dare più problemi... però comunque sia non mi aggiunge la riga :doh: :help:

luca1293
01-09-2012, 08:38
Per un errore mio non ho visto che anziché terminare il "try" entra nell'eccezione e mi dà errore. Non so però che tipo di errore... :(

Riposto il codice completo di tutto il progetto:


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

namespace WindowsFormsApplication1
{
public partial class frmutente : Form
{
public frmutente()
{
InitializeComponent();
}

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

private void cmdinsutente_Click(object sender, EventArgs e)
{
string connString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database1.mdf;Integrated Security=True;User Instance=True";

SqlConnection conn = new SqlConnection(connString);

try
{
int codice = Int32.Parse(txtcod.Text);
string nome = txtnome.Text;
string cognome = txtcognome.Text;
string login = txtlogin.Text;
string pass = txtpass.Text;
string admin = cboadmin.Text;
string query = "INSERT INTO Utenti (Codice_Utente, Nome, Cognome, Login, Password, Administrator) VALUES (@codice, @nome, @cognome, @login, @pass, @admin)";
SqlCommand insert = new SqlCommand(query, conn);

insert.Parameters.AddWithValue("@codice", codice);
insert.Parameters.AddWithValue("@nome", nome);
insert.Parameters.AddWithValue("@cognome", cognome);
insert.Parameters.AddWithValue("@login", login);
insert.Parameters.AddWithValue("@pass", pass);
insert.Parameters.AddWithValue("@admin", admin);

conn.Open();
insert.ExecuteNonQuery();
MessageBox.Show("Record inserted.", "Messaggio di inserimento", MessageBoxButtons.OK);
}

catch (SqlException errore)
{
MessageBox.Show("Errore!");
}
finally
{
conn.Close();
string message = "Vuoi continuare ad inserire utenti?";
string caption = "Form di richiesta";
var result = MessageBox.Show(message, caption, MessageBoxButtons.YesNo);
if (result == System.Windows.Forms.DialogResult.No)
{
this.Close();
}
else
{
txtcod.Text = "";
txtnome.Text = "";
txtcognome.Text = "";
txtlogin.Text = "";
txtpass.Text = "";
cboadmin.Text = "";
}
}
}

}
}


Chiedo aiuto perché non so più dove mettere mano.. :help:

luca1293
01-09-2012, 08:40
Facendo il debug e mettendo i punti di interruzione, l'applicazione esce dal try alla riga dell'"insert.ExecuteNonQuery();".

luca1293
01-09-2012, 10:02
questo è il messaggio di errore che si crea: http://imageshack.us/photo/my-images/28/immaginejbxo.jpg/

idee??? Io non so proprio di che si tratta...

Grazie a tutti per il vostro aiuto! :)

idoido
01-09-2012, 15:12
dall'errore che hai postato, la riga che causa il problema è la conn.open
facendo una ricerca veloce su google il problema potrebbe essere il fatto che nella stringa di connessione usi |DataDirectory| per definire parte del percorso.
fai delle prove facendo riferimento a un percorso fisso (es: c:\db\db1.mdf)

luca1293
01-09-2012, 18:28
Ho risolto il problema copiando e spostando il file Database.mdf nella cartella Bin\"Debug".
Lasciando tutto com'era ho quindi riprovato e mi ha eseguito tutta la funzione correttamente. Come mai questo? Scusa se chiedo, ma vorrei capire perché cambiando directory il tutto funzioni. :D

idoido
02-09-2012, 03:22
perché appunto nella stringa di connessione al db hai |DataDirectory|
ora stai compilando in debug, se compili in release vedrai che non funzionerà perché il db lo andrà a cercare dentro bin\release

comunque l'importante è che ora funzioni, poi man mano lo sistemi

luca1293
02-09-2012, 13:17
Grazie mille del tuo aiuto, senza di te non avrei mai risolto.

Alla prossima!!!! :) :D ;)