using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Data.SqlClient;

public partial class test_transaction_adonet1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {			
    }

	protected void cmd_ajouter_Click(object sender, EventArgs e)
	{
		// préparer la connexion
        string c_string = ConfigurationManager.ConnectionStrings["bancaConnectionString"].ConnectionString; 
		SqlConnection cx_annuaire = new SqlConnection(c_string);
		SqlTransaction trans = null;

		try
		{
			// ouvrir la connexion
			cx_annuaire.Open();
			trans = cx_annuaire.BeginTransaction();

			// préparer la requête d'ajout
            string rq = "insert into utilisateur(utilisateur_nom,utilisateur_tel) values(@nom,@telephone)";
			SqlCommand sql = new SqlCommand(rq, cx_annuaire);
			sql.Parameters.Add("@nom", SqlDbType.VarChar, 100);
			sql.Parameters.Add("@telephone", SqlDbType.VarChar, 10);
			
			// donner les valeurs aux paramètres
			sql.Parameters["@nom"].Value = txt_utilisateur.Text;
			sql.Parameters["@telephone"].Value = txt_telephone.Text;

			// exécuter dans le contexte de la transaction
			sql.Transaction = trans; // très important : associer la transaction à la commande
			sql.ExecuteNonQuery();	

			// vérifier que l'utilisateur n'existe pas déjà			
            SqlCommand verif = new SqlCommand("select count(*) from utilisateur where utilisateur_nom=@nom", cx_annuaire);
			verif.Parameters.Add("@nom", SqlDbType.VarChar, 100);
			verif.Parameters["@nom"].Value = txt_utilisateur.Text;
			
			verif.Transaction = trans;
			int n = (int)verif.ExecuteScalar();
			if (n == 1)
			{
				trans.Commit(); // valider la transaction
				lbl_message.Text = "Utilisateur ajouté";
			}
			else
				throw new Exception("L'utilisateur existe déjà");
		}
		catch (Exception err)
		{
			if (trans != null)
				trans.Rollback(); // invalider la transaction
			
			lbl_message.Text = err.Message;
		}
		finally
		{
			// fermer la connexion
			cx_annuaire.Close();
		}	
	}
}
