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;
using System.Transactions;

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

	protected void cmd_ajouter_Click(object sender, EventArgs e)
	{
		using (TransactionScope trans = new TransactionScope(TransactionScopeOption.RequiresNew))
		{

			// préparer la connexion
			string c_string = @"data source=.\SQL2019; database=annuaire; integrated security=false;user id=saw;password=password";
			SqlConnection cx_annuaire = new SqlConnection(c_string);

			try
			{
				// ouvrir la connexion
				cx_annuaire.Open();
				
				// préparer la requête d'ajout
				string rq = "insert into utilisateur(nom,telephone) 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.ExecuteNonQuery();

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