Related Posts Plugin for WordPress, Blogger...

About

Follow Us

Saturday, 21 February 2015

Explanation:
In this article I have explained the use of transaction using web application. I have used transaction in SQL Stored procedure and used that procedure in my application.
In this application I have entered Employee information in two database tables. i.e. personal and official through one stored procedure. So if one of the queries got some error transaction will not commit. It will be rolled back.


Create a Database: “Test”
Now create two tables:
CREATE TABLE [dbo].[Emp_Personal]
(
                [EmpPer_Id] [int] IDENTITY(1,1) NOT NULL,
                [EmpName] [varchar](100) NULL,
                [Age] [int] NULL,
                [Address] [varchar](500) NULL
)

Create another table "Emp_Office" for storing the employee's official details like his department Name, his designation and the salary using the script below.

CREATE TABLE [dbo].[Emp_Office]
(
                [EmpOffice_Id] [int] IDENTITY(1,1) NOT NULL,
                [EmpPersonal_ID] [int] NULL,
                [Department] [varchar](100) NULL,
                [Designation] [varchar](100) NULL,
                [Salary] [decimal](18, 2) NULL
)

Also create a stored procedure as:

CREATE PROCEDURE [dbo].[InsertEmp_Sp]
                @EmpName                     VARCHAR(100),
                @Age                                INT,
                @Address                        VARCHAR(100),
                @Dept                    VARCHAR(100),
                @Designation                  VARCHAR(100),
                @Salary                            DECIMAL(18,2)              
AS
BEGIN
                BEGIN TRANSACTION                                
                                INSERT INTO Emp_Personal(EmpName,Age,[Address]) VALUES(@EmpName,@Age,@Address)                               
                                IF (@@ERROR <> 0) GOTO ERR_HANDLER
                                 DECLARE @Id int
                                --get the latest inserted id from the EmpPersonalDetail table                  
                                SET @id= scope_identity()
                                 
                     INSERT INTO Emp_Office(Department,Designation,Salary,EmpPersonalDetailIdFk) VALUES (@DeptName,@Designation,@Salary,@id)
                                IF (@@ERROR <> 0) GOTO ERR_HANDLER                    
                COMMIT TRAN                                 
                                RETURN 1
    GOTO AfterErrBlock

                ERR_HANDLER:                             
                ROLLBACK TRAN
                                RETURN 0

                AfterErrBlock:
END


 In the above stored procedure first i am storing the employee's personal details : name, age and address in the "Emp_Personal" table.
Then check error status using @@ERROR. If it is 0 then next i need to get the Id of the last inserted record.
So using 
scope_identity() function id of the last inserted records is fetched from the "Emp_Personal" table and then corresponding to that id, the official details are stored in the "Emp_OfficeDetail" table and the changes are committed to the database using the COMMIT statement. If the @@ERROR status is not 0 then the control will be passed the Error handler where i have written the ROLLBACK statement that will abort the changes made to the database.

So if the transaction succeeded then this stored procedure will return 1 otherwise 0. So we can check in code if transaction is succeeded or  not.

Key Points to remember: @@ERROR returns 0 if the last Transact-SQL statement executed successfully; if the statement generated an error, @@ERROR returns the error number. 

scope_identity() returns the last identity value inserted into an identity column in the same scope.

Web Application:
In the <Body> tag of the design page (.aspx) design the page as shown in above Image using the following Html source:
<form id="form1" runat="server">
<div>
    <fieldset style="width:270px">
    <legend>Transaction In Stored Proc</legend>
     <table>
     <tr><td>Employee Name: </td><td>
         <asp:TextBox ID="txtEmpName" runat="server"></asp:TextBox></td></tr>
     <tr><td>Age: </td><td>
         <asp:TextBox ID="txtAge" runat="server"></asp:TextBox></td></tr>
     <tr><td>Address: </td><td>
         <asp:TextBox ID="txtAddress" runat="server"></asp:TextBox></td></tr>
     <tr><td>Department: </td><td>
         <asp:TextBox ID="txtDept" runat="server"></asp:TextBox></td></tr>
     <tr><td>Designation: </td><td>
         <asp:TextBox ID="txtDesignation" runat="server"></asp:TextBox></td></tr>
     <tr><td>Salary: </td><td>
         <asp:TextBox ID="txtSalary" runat="server"></asp:TextBox></td></tr>
          <tr><td>&nbsp;</td><td>
          <asp:Button ID="btnSubmit" runat="server" Text="Submit"
            onclick="btnSubmit_Click" />
              <asp:Button ID="btnClear" runat="server" Text="Reset"
                  onclick="btnClear_Click" />
              </td></tr>
    </table>
    </fieldset>
    </div>
    </form>

Asp.Net C# code

In the code behind file (.aspx.cs) write the code as:
include the following namespaces:
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

Then write the code as:
protected void btnSubmit_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Empcon"].ConnectionString);
        SqlCommand cmd = new SqlCommand("InsertEmp_Sp", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@EmpName", txtEmpName.Text.Trim());
        cmd.Parameters.AddWithValue("@Age", Convert.ToInt32(txtAge.Text));
        cmd.Parameters.AddWithValue("@Address", txtAddress.Text.Trim());
        cmd.Parameters.AddWithValue("@DeptName", txtDept.Text.Trim());
        cmd.Parameters.AddWithValue("@Designation", txtDesignation.Text.Trim());
        cmd.Parameters.AddWithValue("@Salary", Convert.ToDecimal(txtSalary.Text));

        SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
        returnParameter.Direction = ParameterDirection.ReturnValue;
        con.Open();
        cmd.ExecuteNonQuery();
        int statusVal = Convert.ToInt32(returnParameter.Value);
        if (statusVal == 1)
        {
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Message", "alert('Record saved successfully');", true);
            ClearControls();
        }
        else
        {
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Message", "alert('Record could not be saved');", true);
        }
    }
    protected void btnClear_Click(object sender, EventArgs e)
    {
        ClearControls();
    }
    private void ClearControls()
    {
        txtEmpName.Text = string.Empty;
        txtAge.Text = string.Empty;
        txtAddress.Text = string.Empty;
        txtDept.Text = string.Empty;
        txtDesignation.Text = string.Empty;
        txtSalary.Text = string.Empty;
    }

}

ASP.NET VB code
In the code behind file (.aspx.vb) write the code as:
Include the following three required namespaces:
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration

Then write the code as:
Protected Sub btnSubmit_Click(sender As Object, e As System.EventArgsHandles btnSubmit.Click
        Dim con As New SqlConnection(ConfigurationManager.ConnectionStrings("Empcon").ConnectionString)
        Dim cmd As New SqlCommand("InsertEmp_Sp", con)
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("@EmpName", txtEmpName.Text.Trim())
        cmd.Parameters.AddWithValue("@Age"Convert.ToInt32(txtAge.Text))
        cmd.Parameters.AddWithValue("@Address", txtAddress.Text.Trim())
        cmd.Parameters.AddWithValue("@Dept", txtDept.Text.Trim())
        cmd.Parameters.AddWithValue("@Designation", txtDesignation.Text.Trim())
        cmd.Parameters.AddWithValue("@Salary"Convert.ToDecimal(txtSalary.Text))

        Dim returnParameter As SqlParameter = cmd.Parameters.Add("RetVal"SqlDbType.Int)
        returnParameter.Direction = ParameterDirection.ReturnValue
        con.Open()
        cmd.ExecuteNonQuery()
        Dim statusVal As Integer = Convert.ToInt32(returnParameter.Value)
     If statusVal = 1 Then
            ScriptManager.RegisterStartupScript(MeMe.[GetType](), "Message""alert('Record savedsuccessfully');"True)
            ClearControls()
        Else
            ScriptManager.RegisterStartupScript(MeMe.[GetType](), "Message""alert('Record could not be saved');"True)
        End If
    End Sub


    Protected Sub btnClear_Click(sender As Object, e As System.EventArgsHandles btnClear.Click
        ClearControls()
    End Sub

    
Private Sub ClearControls()
        txtEmpName.Text = String.Empty
        txtAge.Text = String.Empty
        txtAddress.Text = String.Empty
        txtDept.Text = String.Empty
        txtDesignation.Text = String.Empty
        txtSalary.Text = String.Empty

    End Sub

0 comments:

Post a Comment