Hello All, We are going to start new batch from next week. message/call or mail us for more details.

Registration Page Using N-Tier Architecture in ASP.NET

 N-tier application architecture provides a model for developers to create a flexible and reusable application by breaking up an application into tier. The n-Tier application has mainly three tiers or layers; they are called:
1.   Presentation Layer
2.  Business Logic Layer
3.  Data Access Layer
Each layer interacts with the layer directly below, and has specific function to perform.
The Presentation Layer is responsible for displaying the user interface to the end user. The programmer uses this layer for designing the user interface and to transfer data. In ASP.NET, ASPX pages, user controls, server is used to support the presentation layer.
The Business Logic Layer contains all the calculations and Business Rule validations that are required in the application.
Business Logic Layer is the class in which we write functions that get data from Presentation Layer and send that data to database through Data Access Layer. The business layer works as a go-between to transfer the data from presentation layer. Its responsibility is to validate the business rules of the component and communicating with the Data Access Layer.
The Data Access Layer gets the data from the business layer and sends it to the database or vice versa. DAL is responsible for accessing data and forwarding it to BLL. In an ASP.NET n-Tiered architecture, web pages do not make direct calls to the database. A given layer only communicates with its adjacent layers.
Now, Talking about What is the need to divide our code in 3-Tier Architecture? Separation of User Interface, Business Logic and Database Access has many advantages.

  • Reusability of Business Logic Component will help you for Quick Development. Let’s take an example : We have a module that’s functionality is to perform Adding New Records, Updating Existing Record, Deleting Existing Record and Finding the Record in the System. As this component is developed and tested, we can use it in any other project that might involve performing these tasks on records.
  • Transformation of the system is easy. Since the Business Logic is separate from the Data Access Layer, changing the data access layer won’t affect the business logic module much. Let's say if we are moving from SQL Server data storage to Oracle, there shouldn’t be any changes required in the business layer component and in the GUI component.
  • Maintenance of the system is easy. Let's say if there is a minor change in the business logic, we don’t have to install the entire system in individual user’s PCs. Let suppose that the government increases the Entertainment tax rate from 4% to 8 %, we only need to update the business logic component without affecting the productivity of end users and without any downtime.
  • Using 3-Tier Architecture development allows you parallel development on individual tier.
Here is the example that I have created using 3-Tier Architecture Concept. For ease of understanding I have separated the Presentation Layer, Business Access Layer and Data Access Layer.  I have created BAL and DAL into App_Code Folder.
Here is the Screenshot of the Solution Explorer:

N-Tier Architecture in ASP.NET
Lest Start with Coding. Firstly we will go with Data Access Layer then Business Access Layer and then Presentation Layer (UI).

 Creating Data Access Layer (DAL): (RecordDAL.cs)

Add a Class File by Right Clicking on App_Code Folder and name it RecordDAL.cs (In my case I have created it in DAL Folder which is Under App_Code>3-Tier Folder. Below are the codes that I have written for RecordDAL.cs file. Here I have used Stored Procedure to perform the operations in Database.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;

/// <summary>
/// Summary description for RecordDAL
/// </summary>
public class RecordDAL
{
    // Getting Connection String that i have created in web.config file
    string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["3Tier_ConnectionString"].ConnectionString;
    public RecordDAL()
       {
             
       }

    // Used to Insert Records in Database
    public int InsertRecord(string FName,string LName,string FatherName,int Age,string Address,stringPhone,string Email,int UserID)
    {
        //Creating Connection with SQL Server Database
        SqlConnection con = new SqlConnection(conStr);
        con.Open();
        SqlCommand cmd = new SqlCommand("AddRecords",con);
        cmd.CommandType = CommandType.StoredProcedure;
        try
        {
            cmd.Parameters.AddWithValue("@FName", FName);
            cmd.Parameters.AddWithValue("@LName", LName);
            cmd.Parameters.AddWithValue("@FatherName", FatherName);
            cmd.Parameters.AddWithValue("@Age", Age);
            cmd.Parameters.AddWithValue("@Address", Address);
            cmd.Parameters.AddWithValue("@Phone", Phone);
            cmd.Parameters.AddWithValue("@Email", Email);
            cmd.Parameters.AddWithValue("@UserID", UserID);
            return cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            con.Close();
            con.Dispose();
        }
    }

    //Used to Delete Records from the Database
    //This will take UserID as Input Parameter.
    public int DeleteRecord(int UserId)
    {
        SqlConnection con = new SqlConnection(conStr);
        con.Open();
        SqlCommand cmd = new SqlCommand("DeleteRecord",con);
        cmd.CommandType = CommandType.StoredProcedure;
        try
        {
            cmd.Parameters.AddWithValue("@UserId",UserId);
            return cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            con.Close();
            con.Dispose();
        }
       
    }
    //Used to Update Records in the Database
    //This will take UserID as Input Parameter.
    public int UpdateRecord(string FName, string LName, string FatherName, int Age, string Address,string Phone, string Email, int UserID)
    {
        SqlConnection con = new SqlConnection(conStr);
        con.Open();
        SqlCommand cmd = new SqlCommand("UpdateRecord", con);
        cmd.CommandType = CommandType.StoredProcedure;
        try
        {
            cmd.Parameters.AddWithValue("@FName", FName);
            cmd.Parameters.AddWithValue("@LName", LName);
            cmd.Parameters.AddWithValue("@FatherName", FatherName);
            cmd.Parameters.AddWithValue("@Age", Age);
            cmd.Parameters.AddWithValue("@Address", Address);
            cmd.Parameters.AddWithValue("@Phone", Phone);
            cmd.Parameters.AddWithValue("@Email", Email);
            cmd.Parameters.AddWithValue("@UserID", UserID);           
            return cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            con.Close();
            con.Dispose();
        }

    }
    // used to Load All the Records from the Database
    public DataTable RetrieveRecords()
    {
        SqlConnection con = new SqlConnection(conStr);
        SqlDataAdapter da = new SqlDataAdapter("ShowAllRecords", con);
        da.SelectCommand.CommandType = CommandType.StoredProcedure;
        SqlCommandBuilder bui = new SqlCommandBuilder(da);
        DataTable dt = new DataTable();
      
        try
        {
            da.Fill(dt);
            return dt;
        }
        catch
        {
            throw;
        }
        finally
        {
           
            da.Dispose();
            con.Close();
            con.Dispose();
        }

    }
    // Used to Check the existance of the Record.
    public int checkExistance(int UserId)
    {
        SqlConnection con = new SqlConnection(conStr);
        con.Open();
        SqlCommand cmd = new SqlCommand("Select * from tblUserInfo where UserID=" + UserId + "", con);
        SqlDataReader dr;
        try
        {
            dr = cmd.ExecuteReader();
            if (dr.Read())
            {
                return 1;
            }
            else
                return 0;
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            con.Close();
            con.Dispose();
        }
    }
}

In the above code, I have a member variable called conStr that is used to get the database connection string from my web.config file that is being used throughout the class. I have created separate method for inserting, deleting, updating records into database and loading records from database. At the End of the Article I have given the Structure of Respective tables and Used Procedures.

Creating Business Access Layer (BAL):   (RecordBAL.cs)

Add a Class File by Right Clicking on App_Code Folder and name it RecordBAL.cs, (In my case I have created it in BAL Folder which is Under App_Code>3-Tier Folder. This contains methods that are used for calling InsertRecord (), DeleteRecord (),
RetrieveRecords () and checkExistance () method of Data Access Layer Class File. Below are the codes that I have written for RecordBAL.cs file.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;

/// <summary>
/// Summary description for RecordBAL
/// </summary>
public class RecordBAL
{
       public RecordBAL()
       {
             
       }
    //Used for Loading All Records from Database
    public DataTable RetrieveRecords()
    {
        //Creating the object of DAL file.
        RecordDAL rdAL = new  RecordDAL();
        try
        {
            //Calling the method of DAl using DAL object
            //and return the result to the caller of the method.
            return rdAL.RetrieveRecords();
        }
        catch
        {
            throw;
        }
        finally
        {
            rdAL = null;
        }
    }
    //Used for Inserting Record in the Database
    public int InsertRecord_BAL(string FName, string LName, string FatherName, int Age,string Address, string Phone, string Email, int UserID)
    {
        RecordDAL rDal = new RecordDAL();       
        try
        {
            return rDal.InsertRecord( FName,LName,FatherName,Age,Address,Phone,Email,UserID);
        }
        catch
        {
            throw;
        }
        finally
        {
            rDal = null;
        }
    }
    // Used for Deleting the Records from the Database
    public int DeleteRecord_BAL(int UserID)
    {
        RecordDAL rDal = new RecordDAL();
        try
        {
            return rDal.DeleteRecord(UserID);
        }
        catch
        {
            throw;
        }
        finally
        {
            rDal = null;
        }
    }

    //Used for Updating Record in Database
    public int UpdateRecord_BAL(string FName, string LName, string FatherName, int Age,string Address, string Phone, string Email, int UserID)
    {
        RecordDAL rDal = new RecordDAL();
        try
        {
            return rDal.UpdateRecord(FName, LName, FatherName, Age, Address, Phone, Email, UserID);
        }
        catch
        {
            throw;
        }
        finally
        {
            rDal = null;
        }
    }
    // Used for checking exixtance of the Record in the Database
    public int checkExistance_BAL(int UserID)
    {
        RecordDAL rDal = new RecordDAL();
        try
        {
            return rDal.checkExistance(UserID);
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            rDal = null;
        }
    }
}

Creating Presentation Layer (UI): (Default.aspx)

Till Now, we have created our Data Access Layer (DAL), Business Access Layer (BAL). Now, we are going to create our Presentation Layer that is User Interface (UI), it will accept the value from the user. Add a new WebPage to your project. Here I named it Default.aspx
Here is the Screenshot of the UI that I have created to accept the values from the user.
N-Tier Architecture in ASP.NET

Code for Default.aspx file


<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs"Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Add New Records (3-Tier Architecture in ASP.NET)</title>
    <script type="text/javascript">
        // This will prevent to Go Back
        window.history.forward(0);
        function noBack()
        {
            window.history.forward();
        }
        //This will take the ref of textbox and will trim the white-spaces
        function trim(id) {
            if (id != null)
                id.value = id.value.toString().replace(/^\s+|\s+$/g, "");
        }
    </script>
</head>
<body >
    <form id="form1" runat="server">
    <div style="margin:0 auto; width:700px; text-align:center" >
   
        <table style="margin:0 auto;" width="400px" >
            <tr>
                <td colspan="2" align="center" bgcolor="#99CCFF">
                    <asp:Label ID="Label1" runat="server" Text="Add New Records" Font-Bold="True"
                        Font-Names="Georgia" ForeColor="#0033CC"></asp:Label>
                    &nbsp;</td>
            </tr>
            <tr>
                <td align="right" >
                    <asp:Label ID="Label8" runat="server" Text="User ID"></asp:Label>
                </td>
                <td align="left">
                    <asp:TextBox ID="txtUserID" runat="server" Width="180px"onblur="trim(this)"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator8" runat="server"
                        ControlToValidate="txtUserID" ErrorMessage="*"
                        ToolTip="Provi User ID"></asp:RequiredFieldValidator>
                    <asp:RegularExpressionValidator ID="RegularExpressionValidator3"runat="server"
                        ControlToValidate="txtUserID" ToolTip="This Will Take Number Only (Ex: 1)"
                        ErrorMessage="*" ValidationExpression="^[0-9]+$"></asp:RegularExpressionValidator>
                </td>
            </tr>
            <tr>
                <td align="right" >
                    <asp:Label ID="Label2" runat="server" Text="First Name"></asp:Label>
                </td>
                <td align="left">
                    <asp:TextBox ID="txtFName" runat="server" Width="180px"onblur="trim(this)"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
                        ControlToValidate="txtFName" ErrorMessage="*"
                        ToolTip="First Name Can't be Left Blank"></asp:RequiredFieldValidator>
                </td>
            </tr>
            <tr>
                <td align="right" >
                    <asp:Label ID="Label3" runat="server" Text="Last Name"></asp:Label>
                </td>
                <td align="left">
                    <asp:TextBox ID="txtLName" runat="server" Width="180px"onblur="trim(this)"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server"
                        ControlToValidate="txtLName" ErrorMessage="*"
                        ToolTip="Last Name Can't Be Left Blank"></asp:RequiredFieldValidator>
                </td>
            </tr>
            <tr>
                <td align="right" >
                    <asp:Label ID="Label4" runat="server" Text="Father Name" ></asp:Label>
                </td>
                <td align="left">
                    <asp:TextBox ID="txtFatherName" runat="server" Width="180px"onblur="trim(this)"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server"
                        ControlToValidate="txtFatherName" ErrorMessage="*"
                        ToolTip="Father Name Can't Be Left Blank"></asp:RequiredFieldValidator>
                </td>
            </tr>
            <tr>
                <td align="right" >
                    <asp:Label ID="Label5" runat="server" Text="Age"></asp:Label>
                </td>
                <td class="style3" align="left">
                    <asp:TextBox ID="txtAge" runat="server" Width="100px"onblur="trim(this)"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server"
                        ControlToValidate="txtAge" ErrorMessage="*" ToolTip="Age Can't Be Left Blank"></asp:RequiredFieldValidator>
                    <asp:RegularExpressionValidator ID="RegularExpressionValidator2"runat="server"
                        ControlToValidate="txtAge" ToolTip="Enter Numbers Only (Ex: 25)"ErrorMessage="*" ValidationExpression="^[0-9]+$"></asp:RegularExpressionValidator>
                </td>
            </tr>
            <tr>
                <td align="right" >
                    <asp:Label ID="Label6" runat="server" Text="Address" ></asp:Label>
                </td>
                <td align="left">
                    <asp:TextBox ID="txtAddress" runat="server" Height="49px"TextMode="MultiLine"
                        Width="180px" onblur="trim(this)"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server"
                        ControlToValidate="txtAddress" ErrorMessage="*"
                        ToolTip="Provide Address Details"></asp:RequiredFieldValidator>
                </td>
            </tr>
            <tr>
                <td align="right" >
                    <asp:Label ID="Label7" runat="server" Text="Phone No."></asp:Label>
                </td>
                <td align="left">
                    <asp:TextBox ID="txtPhone" runat="server" Width="180px"onblur="trim(this)"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator6" runat="server"
                        ControlToValidate="txtPhone" ErrorMessage="*"
                        ToolTip="Provide Phone Details"></asp:RequiredFieldValidator>
                    <asp:RegularExpressionValidator ID="RegularExpressionValidator4"runat="server"
                        ControlToValidate="txtPhone"
                        ToolTip="This Will Take Number Only (Ex: 9889989898)"ErrorMessage="*"
                        ValidationExpression="^[0-9]+$"></asp:RegularExpressionValidator>
                </td>
            </tr>
            <tr>
                <td align="right">
                    Email ID</td>
                <td align="left">
                    <asp:TextBox ID="txtEmail" runat="server" Width="180px"onblur="trim(this)"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator7" runat="server"
                        ControlToValidate="txtEmail" ErrorMessage="*" ToolTip="Provide Email ID"></asp:RequiredFieldValidator>
                    <asp:RegularExpressionValidator ID="RegularExpressionValidator1"runat="server" ErrorMessage="*"
                    ToolTip="Invalid Email Format. (Ex: abc@xyz.com)"
                        ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"
                        ControlToValidate="txtEmail"></asp:RegularExpressionValidator>
                </td>
            </tr>
            <tr>
                <td align="right" >
                    &nbsp;</td>
                <td align="left">
                    <asp:Button ID="btnSave" runat="server" Text="Save" Width="95px"
                        onclick="btnSave_Click" Font-Bold="True" Font-Names="Georgia"  />
                    <asp:HyperLink ID="HyperLink1" runat="server"NavigateUrl="ShowRecords.aspx">Show Records</asp:HyperLink>
                </td>
            </tr>
            <tr>
                <td align="right" >
                    &nbsp;</td>
                <td align="left">
                    <asp:Label ID="lblMessage" runat="server" Font-Bold="True" Font-Names="Georgia"
                        Font-Size="Medium" ForeColor="Red"></asp:Label>
                </td>
            </tr>
            <tr>
                <td align="right" colspan="2" >
                <hr style="border-color: #6699FF; background-color: #99CCFF" />
                    &nbsp;</td>
            </tr>
        </table>
   
    </div>
    </form>
</body>
</html>

The above code contains all the validation on User Input. Like Text Can’t Be Left Blank, Only Numbers in TextBox, Only Alphabets in TextBox, and Email Format Validation at client-side. It will also check that whether the record already exists in database.

Code for Default.aspx.cs file


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{  
    protected void Page_Load(object sender, EventArgs e)
    {
       
    }
    protected void btnSave_Click(object sender, EventArgs e)
    {
        //Creating the object of BAL
        RecordBAL rBAL=new RecordBAL();      

        int recordStatus = 0;
        string FName=txtFName.Text.ToString();
        string LName=txtLName.Text.ToString();
        string FatherName=txtFatherName.Text.ToString();
        int Age=Convert.ToInt32( txtAge.Text);
        string Address=txtAddress.Text.ToString();
        string Phone=txtPhone.Text.ToString();
        string Email=txtEmail.Text.ToString();
        int UserID=Convert.ToInt32(txtUserID.Text);

        try
        {
            //Passing the Parameter in the Method of BAl using BAL object
            recordStatus = rBAL.checkExistance_BAL(UserID);
            if (recordStatus > 0)
            {
                lblMessage.Text = "This User ID Already Exists.";
                return;
            }

            recordStatus = rBAL.InsertRecord_BAL(FName, LName, FatherName, Age, Address, Phone, Email, UserID);
            if(recordStatus > 0)
                lblMessage.Text = "New Record Inserted Successfully.";
            //else
            //    lblMessage.Text = "This Record Already Exists.";
        }
        catch (Exception ex)
        {
            lblMessage.Text = ex.Message.ToString();
        }
        finally
        {
            rBAL = null;           
        }

      
    }
}

Now, to display the records, I have created another page and named it ShowRecords.aspx. Here is the Screenshot of the UI ofShowRecords.aspx

ShowRecords.aspx (UI)

N-Tier Architecture in ASP.NET
This will get all the Record from the database and display it in GridView. Here I have make the GridView Editable to enable it to perform Update and Delete Operation. You can Perform Update Operation by Clicking on Edit Button and can perform Delete Operation by ClickingDelete Button in GridView.

Code for ShowRecords.aspx file


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ShowRecords.aspx.cs"Inherits="ShowRecords" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>List of All Records (3-Tier Architecture in ASP.NET)</title>
    <script type="text/javascript">
        window.history.forward(0);
        function noBack()
        {
            window.history.forward();
        }
        function trim(id) {
            if (id != null)
                id.value = id.value.toString().replace(/^\s+|\s+$/g, "");
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div style="margin: 0 auto;" width="1100px">
        <table style="margin: 0 auto;" width="1100px">
            <tr>
                <td>
                    <asp:HyperLink ID="HyperLink1" runat="server"
                        NavigateUrl="~/3-Tier/Default.aspx">Add New Record</asp:HyperLink>
                </td>
            </tr>
            <tr>
                <td bgcolor="#6699FF" align="center">
                    &nbsp;
                    <asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Names="Georgia" ForeColor="White"
                        Text="List of All Records"></asp:Label>
                </td>
            </tr>
            <tr>
                <td align="center">
                    <asp:GridView ID="GridViewShowRecords" runat="server" BackColor="White"BorderColor="#DEDFDE"
                        BorderStyle="None" BorderWidth="1px" CellPadding="4"EnableModelValidation="True"
                        ForeColor="Black" GridLines="Vertical" AutoGenerateColumns="false"OnRowCancelingEdit="RowCancelingEdit"
                        OnRowDeleting="RowDeleting" OnRowEditing="RowEditing"OnRowUpdating="RowUpdating">
                        <AlternatingRowStyle BackColor="White" />
                        <FooterStyle BackColor="#CCCC99" />
                        <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White"/>
                        <PagerStyle BackColor="#F7F7DE" ForeColor="Black"HorizontalAlign="Right" />
                        <RowStyle BackColor="#F7F7DE" />
                        <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True"ForeColor="White" />
                        <Columns>
                            <asp:TemplateField>
                                <HeaderTemplate>
                                    ID</HeaderTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="lblUserID" runat="server"Text='<%#Bind("UserId") %>'></asp:Label>
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtUserID" Text='<%#Bind("UserId") %>'runat="server" Width="20px"
                                        Enabled="False"></asp:TextBox>
                                </EditItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField>
                                <HeaderTemplate>
                                    FirstName</HeaderTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="lblFirstName" runat="server"Text='<%#Bind("FName") %>'></asp:Label>
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtFirstName" Text='<%#Bind("FName")%>' runat="server" Width="80px"></asp:TextBox>
                                    <asp:RequiredFieldValidatorID="RequiredFieldValidator1" runat="server" ErrorMessage="RequiredFieldValidator"
                                        ControlToValidate="txtFirstName" ToolTip="Can't Be Left Blank.">*</asp:RequiredFieldValidator>
                                </EditItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField>
                                <HeaderTemplate>
                                    LastName</HeaderTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="lblLastName" runat="server"Text='<%#Bind("LName") %>'></asp:Label>
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtLastName" Text='<%#Bind("LName")%>' runat="server" Width="80px"></asp:TextBox>
                                    <asp:RequiredFieldValidatorID="RequiredFieldValidator2" runat="server" ErrorMessage="RequiredFieldValidator"
                                        ControlToValidate="txtLastName" ToolTip="Can't Be Left Blank.">*</asp:RequiredFieldValidator>
                                </EditItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField>
                                <HeaderTemplate>
                                    FatherName</HeaderTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="lblFatherName" runat="server"Text='<%#Bind("FatherName") %>'></asp:Label>
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtFatherName"Text='<%#Bind("FatherName") %>' runat="server" Width="100px"></asp:TextBox>
                                    <asp:RequiredFieldValidatorID="RequiredFieldValidator3" runat="server" ErrorMessage="RequiredFieldValidator"
                                        ControlToValidate="txtFatherName" ToolTip="Can't Be Left Blank.">*</asp:RequiredFieldValidator>
                                </EditItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField>
                                <HeaderTemplate>
                                    Age</HeaderTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="lblAge" runat="server"Text='<%#Bind("Age") %>'></asp:Label>
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtAge" Text='<%#Bind("Age") %>'runat="server" Width="30px"></asp:TextBox>
                                    <asp:RequiredFieldValidatorID="RequiredFieldValidator4" runat="server" ErrorMessage="RequiredFieldValidator"
                                        ControlToValidate="txtAge" ToolTip="Provide Age Details.(EX: 24)">*</asp:RequiredFieldValidator>
                                    <asp:RegularExpressionValidatorID="RegularExpressionValidator2" runat="server" ControlToValidate="txtAge"
                                        ToolTip="Enter Numbers Only (Ex: 25)"ErrorMessage="*" ValidationExpression="^[0-9]+$"></asp:RegularExpressionValidator>
                                </EditItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField>
                                <HeaderTemplate>
                                    Address</HeaderTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="lblAddress" runat="server"Text='<%#Bind("Address") %>'></asp:Label>
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtAddress" Text='<%#Bind("Address")%>' runat="server" Width="150px"></asp:TextBox>
                                    <asp:RequiredFieldValidatorID="RequiredFieldValidator5" runat="server" ErrorMessage="RequiredFieldValidator"
                                        ControlToValidate="txtAddress" ToolTip="Provide Address Details.">*</asp:RequiredFieldValidator>
                                </EditItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField>
                                <HeaderTemplate>
                                    Phone</HeaderTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="lblPhone" runat="server"Text='<%#Bind("Phone") %>'></asp:Label>
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtPhone" Text='<%#Bind("Phone") %>'runat="server" Width="80px"></asp:TextBox>
                                    <asp:RequiredFieldValidatorID="RequiredFieldValidator6" runat="server" ErrorMessage="RequiredFieldValidator"
                                        ControlToValidate="txtPhone" ToolTip="Provide Phone No. Details.">*</asp:RequiredFieldValidator>
                                    <asp:RegularExpressionValidatorID="RegularExpressionValidator4" runat="server" ControlToValidate="txtPhone"
                                        ToolTip="This Will Take Number Only (Ex: 9889989898)" ErrorMessage="*" ValidationExpression="^[0-9]+$"></asp:RegularExpressionValidator>
                                </EditItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField>
                                <HeaderTemplate>
                                    Email</HeaderTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="lblEmail" runat="server"Text='<%#Bind("Email") %>'></asp:Label>
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtEmail" Text='<%#Bind("Email") %>'runat="server" Width="120px"></asp:TextBox>
                                    <asp:RequiredFieldValidatorID="RequiredFieldValidator7" runat="server" ErrorMessage="RequiredFieldValidator"
                                        ControlToValidate="txtEmail" ToolTip="Provide Email Details.(EX: abc@xyz.com)">*</asp:RequiredFieldValidator>
                                    <asp:RegularExpressionValidatorID="RegularExpressionValidator1" runat="server" ErrorMessage="*"
                                        ToolTip="Invalid Email Format. (Ex: abc@xyz.com)"ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"
                                        ControlToValidate="txtEmail"></asp:RegularExpressionValidator>
                                </EditItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField>
                                <HeaderTemplate>
                                    Command Button</HeaderTemplate>
                                <ItemTemplate>
                                    <asp:Button ID="btnEdit" runat="server"CommandName="Edit" Text="Edit" />
                                    <asp:Button ID="btnDelete" runat="server"CommandName="Delete" Text="Delete" CausesValidation="true"
                                        OnClientClick="return confirm('Are you sure?')"/>                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:Button ID="btnUpdate" runat="server"CommandName="Update" Text="Update" />
                                    <asp:Button ID="btnCancel" runat="server"CommandName="Cancel" Text="Cancel" CausesValidation="false" />
                                </EditItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>
                </td>
            </tr>
            <tr>
                <td>                  
                    <asp:Label ID="lblMessage" runat="server" Font-Bold="True" Font-Names="Georgia" ForeColor="Red"></asp:Label>
                </td>
            </tr>
            <tr>
                <td>
                    <hr style="border-color: #6699FF" />
                </td>
            </tr>
        </table>
    </div>
    </form>
</body>
</html>

Code for ShowRecords.aspx.cs file


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data; 

public partial class ShowRecords : System.Web.UI.Page
{  
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //Binding the GridView
            BindGridViewShowRecords();
        }
    }
    private void BindGridViewShowRecords()
    {
        //Setting the DataSource of GridView
        GridViewShowRecords.DataSource = GridShowRecordsDataSource();
        GridViewShowRecords.DataBind();
    }
    private DataTable GridShowRecordsDataSource()
    {
        //Creating object of BAL
        RecordBAL rBAL = new  RecordBAL();
        DataTable dTable = new DataTable();
        try
        {
            //Getting the DataSource for GridView from BAL Using BAL object
            dTable = rBAL.RetrieveRecords();
           
        }
        catch (Exception ex)
        {
           lblMessage.Text = ex.Message.ToString();
        }
        finally
        {
            rBAL = null;
        }
        return dTable;
       
    }
    protected void RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        GridViewShowRecords.EditIndex = -1;
        BindGridViewShowRecords();
    }  
    protected void RowEditing(object sender, GridViewEditEventArgs e)
    {
        GridViewShowRecords.EditIndex = e.NewEditIndex;
        BindGridViewShowRecords();
    }
    protected void RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        int recordStatus = 0;

        try
        {
            TextBox UserID = GridViewShowRecords.Rows[e.RowIndex].FindControl("txtUserID"as TextBox;
            TextBox FName = GridViewShowRecords.Rows[e.RowIndex].FindControl("txtFirstName"as TextBox;
            TextBox LName = GridViewShowRecords.Rows[e.RowIndex].FindControl("txtLastName"as TextBox;
            TextBox FatherName = GridViewShowRecords.Rows[e.RowIndex].FindControl("txtFatherName"as TextBox;
            TextBox Age = GridViewShowRecords.Rows[e.RowIndex].FindControl("txtAge"as TextBox;
            TextBox Address = GridViewShowRecords.Rows[e.RowIndex].FindControl("txtAddress"as TextBox;
            TextBox Phone = GridViewShowRecords.Rows[e.RowIndex].FindControl("txtPhone"as TextBox;
            TextBox Email = GridViewShowRecords.Rows[e.RowIndex].FindControl("txtEmail"as TextBox;          

            RecordBAL rBAL = new RecordBAL();
            try
            {
              
                recordStatus = rBAL.UpdateRecord_BAL(FName.Text.Trim(),LName.Text.Trim(),FatherName.Text.Trim(),Convert.ToInt32(Age.Text.Trim()),Address.Text.Trim(),
Phone.Text.Trim(),Email.Text.Trim(),Convert.ToInt32( UserID.Text.Trim()));
                if (recordStatus > 0)
                    lblMessage.Text = "Record Updated Successfully.";
                else
                   lblMessage.Text = "Record couldn't updated";
            }
            catch (Exception ee)
            {
               lblMessage.Text = ee.Message.ToString();
            }
            finally
            {
                rBAL = null;
            }

            GridViewShowRecords.EditIndex = -1;
            BindGridViewShowRecords();
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
    }
    protected void RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
       
        int recordStatus = 0;
        Label UserID = GridViewShowRecords.Rows[e.RowIndex].FindControl("lblUserID"as Label;
        int id = Convert.ToInt32(UserID.Text);

        RecordBAL rBAL = new RecordBAL();
        try
        {
            recordStatus = rBAL.DeleteRecord_BAL(id);
            if (recordStatus > 0)
                lblMessage.Text = "Record Deleted Successfully.";
            else
                lblMessage.Text = "Record couldn't Deleted";
        }
        catch (Exception ee)
        {
            lblMessage.Text = ee.Message.ToString();
        }
        finally
        {
            rBAL = null;
        }

        GridViewShowRecords.EditIndex = -1;
        BindGridViewShowRecords();
    }
}

 Following are the Screenshots of the output window of the program.
N-Tier Architecture in ASP.NET
N-Tier Architecture in ASP.NET

Database Structure

Following are the structure of the Respective Tables and Stored Procedures used in this example.
tblUserInfo
CREATE TABLE [dbo].[tblUserInfo]
(
      [FName] [varchar](100) NOT NULL,
      [LName] [varchar](100) NULL,
      [FatherName] [varchar](100) NULL,
      [Age] [int] NULL,
      [Address] [varchar](200) NULL,
      [Phone] [varchar](20) NULL,
      [Email] [varchar](50) NULL,
      [UserID] [int] primary key,
)

Stored Procedure


AddRecords
CREATE PROCEDURE [dbo].[AddRecords]
      (          
            @FName varchar(100),
            @LName varchar(100),
            @FatherName varchar(100),
            @Age int,
            @Address varchar(200),
            @Phone varchar(20),
            @Email varchar(50),
            @UserID int
      )
AS
      insert into tblUserInfo
      (FName,LName,FatherName,Age,Address,Phone,Email,UserID)
      values
      (@FName,@LName,@FatherName,@Age,@Address,@Phone,@Email,@UserID )
      RETURN
GO

UpdateRecord 

CREATE PROCEDURE [dbo].[UpdateRecord]
      (
            @FName varchar(100),
            @LName varchar(100),
            @FatherName varchar(100),
            @Age int,
            @Address varchar(200),
            @Phone varchar(20),
            @Email varchar(50),
            @UserID int
      )
AS
      update tblUserInfo
      set  
            FName=@FName,
            LName=@LName,
            FatherName=@FatherName,
            Age=@Age,
            Address=@Address,
            Phone=@Phone,
            Email=@Email
           
      where
            UserID= @UserID
      RETURN
GO

DeleteRecord

CREATE PROCEDURE [dbo].[DeleteRecord]
      (
      @UserId int
      )
     
AS
      delete from tblUserInfo where UserID = @UserId
      RETURN
GO

136 comments:

  1. This blog is very useful for Students , Learned a lot of new technonologies and thanks for sharing
    .Net Online Training Bangalore

    ReplyDelete
  2. I am glad to read this. Thank you for this beautiful content, Keep it up. Techavera is the best Web development training course in Noida. Visit us For Quality Learning.Thank you

    ReplyDelete
  3. Thankyou for sharing great article, you can also visit: .Net Training in Toronto

    ReplyDelete
  4. This is most informative and also this post most user friendly and super navigation to all posts... Thank you so much for giving this information to me.. 
    Data Science course in Chennai
    Data science course in bangalore
    Data science course in pune
    Data science online course
    Data Science Interview questions and answers
    Data Science Tutorial

    ReplyDelete
  5. Wonderful Blog post, great article that you have provided for peoples. Its really good. Nice information.


    Data Science in Bangalore

    ReplyDelete
  6. Attend The Python training in bangalore From ExcelR. Practical Python training in bangalore Sessions With Assured Placement Support From Experienced Faculty. ExcelR Offers The Python training in bangalore.
    python training in bangalore

    ReplyDelete
  7. I really enjoyed reading this post, big fan. Keep up the good work andplease tell me when can you publish more articles or where can I read more on the subject?



    BIG DATA COURSE MALAYSIA

    ReplyDelete
  8. Awesome blog. I enjoyed reading your articles. This is truly a great read for me. I have bookmarked it and I am looking forward to reading Python classes in pune new articles. Keep up the good work!

    ReplyDelete
  9. It is amazing and wonderful to visit your site.Thanks for sharing this information,this is useful.Dot Net Training in Bangalore

    ReplyDelete
  10. This is an awesome blog. Really very informative and creative contents. This concept is a good way to enhance the knowledge. Thanks for sharing.
    ExcelR business analytics course

    ReplyDelete
  11. Really very happy to say, your post is very interesting to read. I never stop myself to say something about it. You’re doing a great job. Keep it up…

    Upgrade your career Learn Oracle Training from industry experts gets complete hands on Training, Interview preparation, and Job Assistance at Softgen Infotech.

    ReplyDelete
  12. Great post i must say and thanks for the information. Education is definitely a sticky subject. However, is still among the leading topics of our time. I appreciate your post and look forward to more.

    artificial Intelligence course

    machine learning courses in mumbai

    ReplyDelete
  13. cool stuff you have and you keep overhaul every one of us
    data science bootcamp malaysia

    ReplyDelete
  14. Wonderful blog post. This is absolute magic from you! I have never seen a more wonderful post than this one. You've really made my day today with this. I hope you keep this up!
    data science certification

    ReplyDelete

  15. Actually I read it yesterday but I had some thoughts about it and today I wanted to read it again because it is very well written.
    artificial intelligence course in bangalore

    ReplyDelete
  16. Truly incredible blog found to be very impressive due to which the learners who ever go through it will try to explore themselves with the content to develop the skills to an extreme level. Eventually, thanking the blogger to come up with such an phenomenal content. Hope you arrive with the similar content in future as well.

    Digital Marketing training

    ReplyDelete
  17. A great piece of writing! You have an efficient flair for high quality writing. I am highly impressed by your way of writing this content beyond words. I really have a lot of appreciation for your writing. Thank you so much for all your priceless input on this topic.
    SAP training in Kolkata
    SAP course in kolkata

    ReplyDelete
  18. I really have a lot of appreciation for your writing. Thank you so much for all your priceless input on this topic.
    SAP training in Mumbai
    SAP course in Mumbai

    ReplyDelete
  19. Great post! I am actually getting ready to across this information, is very helpful my friend. Also great blog here with all of the valuable information you have. Keep up the good work you are doing here. ExcelR Data Analytics Course

    ReplyDelete


  20. Wow what a Great Information about World Day it's an exceptionally pleasant educational post. a debt of gratitude is in order for the post.
    Data Science Training in Hyderabad

    ReplyDelete
  21. This is an awesome motivating article.I am practically satisfied with your great work.You put truly extremely supportive data. Keep it up. Continue blogging. Hoping to perusing your next post
    data scientist training in hyderabad

    ReplyDelete
  22. First You got a great blog .I will be interested in more similar topics. I see you have really very useful topics, I will be always checking your blog thanks.
    business analytics course

    ReplyDelete
  23. I was very pleased to find this site.I wanted to thank you for this great read!! I definitely enjoy every little bit of it and I have you bookmarked to check out new stuff you post.
    business analytics course

    ReplyDelete
  24. Awesome article. I enjoyed reading your articles. this can be really a good scan for me. wanting forward to reading new articles. maintain the nice work!

    AWS Training in Hyderabad

    ReplyDelete
  25. I am very happy when this blog post read because blog post written in good manner and write on good topic.
    Thanks for sharing valuable information…

    Data Science Training in Hyderabad

    ReplyDelete
  26. Detiled article, very well explained thanks for sharing with us.


    Data Science Training in Pune

    ReplyDelete
  27. I am impressed by the information that you have on this blog. It shows how well you understand this subject.
    data science course


    ReplyDelete
  28. AI Patasala highly acclaimed Python Course in the Hyderabad course is your ideal choice for a career in Python.
    Python Institute in Hyderabad

    ReplyDelete
  29. Be transformed into an employment-ready professional in Artificial Intelligence by enrolling in the AI Patasala Institute advanced AI Training in the Hyderabad program.
    Artificial Intelligence Courses

    ReplyDelete
  30. Extraordinary post I should state and a debt of gratitude is in order for the data. Instruction is unquestionably a clingy subject. Be that as it may, is still among the main subjects within recent memory. I value your post and anticipate more.cloud computing course in patna

    ReplyDelete
  31. There is obviously a lot to know about this. I think you made some good points in Features also. Keep working, great job!
    artificial intelligence training in aurangabad

    ReplyDelete
  32. Really nice and interesting post. I was looking for this kind of information and enjoyed reading this one. Keep posting. Thanks for sharing.
    data science training

    ReplyDelete
  33. very interesting post.this is my first time visit here.i found so many interesting stuff in your blog especially its discussion..thanks for the post! data science training in noida

    ReplyDelete
  34. Very good message. I came across your blog and wanted to tell you that I really enjoyed reading your articles.

    Business Analytics Course

    ReplyDelete
  35. It's like you've got the point right, but forgot to include your readers. Maybe you should think about it from different angles.
    Data Scientist Course in Bangalore

    ReplyDelete
  36. Need to Have DevOps Training in Chennai for a peaky career? Get with us to the best software training institute in Chennai, Infycle Technologies for an excellent and the amazing career opportunities along with the excellent hands-on training for the enrichment of the knowledge. Know more by calling 7504633633 or 7502633633 and get a more.

    ReplyDelete
  37. It is perfect chance to make a couple of game plans for the future and the opportunity has arrived to be sprightly. I've scrutinized this post and if I may I have the option to need to suggest you some interesting things or recommendations. Perhaps you could create next articles insinuating this article. I have to examine more things about it!

    ReplyDelete
  38. Pleasant data, important and incredible structure, as offer great stuff with smart thoughts and ideas, loads of extraordinary data and motivation, the two of which I need, because of offer such an accommodating data here.

    ReplyDelete
  39. Для примера, как пополнить счет на гидре делится детальнейшими советами, чтоб не стать жертвой злоумышленников в сети. Кибернетическая безопасность уже стало полноценным типом для обеспеченности качественной деятельности в сети. Лишь только определенный показатель знаний дает клиентам протекцию персональных данных.

    ReplyDelete
  40. Можно ли авторизоваться на сайт новейшего маркетплейса Hydra RU в режиме анонима список зеркал гидры 2022

    ReplyDelete
  41. Воспользуйтесь форумом, на котором возможно прочитать практические рекомендации профессионалов. Можно ли обезопасить себя от атаки мошенников, можно прочитать парочку практических рекомендаций. Множество способов, что вы прочитаете на страницах прохождение гидры 2022, будут действительны. Имеется множество вариантов обезопасить персональный компьютер от кибернетической атаки.

    ReplyDelete
  42. Надежный вход на портал Hydra RU hydra баланс Зугдиди

    ReplyDelete
  43. Для новеньких покупателей может быть проблемно залогиниться на торговую платформу UnionГИДРА. СвежийДоступный каталог запасных линков есть возможность элементарно обнаружить в интернете. Как зарегиться на проект ГидраUnion с компа? Опубликовано огромнейшее множество источников, по которым покупатель может попасть на https://store.hydra2onion.cn.

    ReplyDelete
  44. Какие существуют вариации кибербезопасности актуальная ссылка на гидру 2022

    ReplyDelete
  45. Нереально крутой интерактивный магазин в интернет-сети образовался на странице гидра сайт наркотиков. Некоторые юзеры маркетплейсов выбирают закупляться полностью скрытно. Отыскивая в сети интернет необычные вещи, юзер в итоге столкнется с проектом Hydra. В глобальной сети в высшей степени достаточно современных интерактивных магазинов.

    ReplyDelete
  46. На сайте HydraЮнион слишком тяжело получить вещи привычным способом, а перевод принимают лишь через электронный счет. Вот тут http://tritium.earth/index.php?title=Hydra сайт 2022 указан действенный каталог реализуемого товара. На Hidra имеется на удивление много особого товара, который доступен всем клиентам интернет-сети.

    ReplyDelete
  47. Также стоит указать, что скрытные проплаты используют не только злодеи, но и рядовые пользователи. Вообразите, ведь никто не посчитает нужным заплатить серьезные денежки как налоги от нечего делать, проводя выгодную операцию. Перевести деньги скрытно стает слишком сложно. Самой известной причиной для выставления скрытого платежа http://klauskateisto.lt/index.php?qa=user&qa_1=orilem представляется заработок в интернете.

    ReplyDelete
  48. Продвинутые продавцы магазина Гидра РУ имеют определенный ранг, что открыт каждому клиенту сайта. В этом месте можно купить какие угодно вещества, смартфоны и дорогостоящую информацию. Отыскать требуемый товар очень просто – возможно проанализировать цену, или открыть показатель реализаторов. На платформе http://zhouyi68.com/home.php?mod=space&uid=624416 пользователи имеют возможность купить вещи поодиночке, а также значительными частями.

    ReplyDelete
  49. Реально ли уберечься от атаки хакеров, необходимо просмотреть небольшое количество практичных рекомендаций. Воспользуйтесь порталом, в котором можно прочитать практичные наставления опытных участников сообщества. Множество вариантов, что юзеры увидят на портале http://www.thawka.de/galerie/member.php?action=showprofile&user_id=1771, абсолютно практичны. Присутствует множество методик обезопасить личный ПК от кибер вмешательств.

    ReplyDelete
  50. 360DigiTMG, the top-rated organisation among the most prestigious industries around the world, is an educational destination for those looking to pursue their dreams around the globe. The company is changing careers of many people through constant improvement, 360DigiTMG provides an outstanding learning experience and distinguishes itself from the pack. 360DigiTMG is a prominent global presence by offering world-class training. Its main office is in India and subsidiaries across Malaysia, USA, East Asia, Australia, Uk, Netherlands, and the Middle East.

    ReplyDelete
  51. Немного дистрибутивов или услуг на платной основе, но большое количество развлечений найдутся в виде ознакомительных источников. Проект «Гидра» предоставляет шанс юзерам инета отыскивать друзей за счет общения на интересующую их тему. На форуме http://bogun79.jinbo.net/xe/index.php?mid=bogun_03_03&document_srl=73075 кроме того присутствует громадное множество занимательных материалов – специализированные интерактивные курсы, программы и маркетплейс с товарами.

    ReplyDelete
  52. Высокий уровень защиты при сделке на Гидре как попасть на гидру 2022

    ReplyDelete
  53. Внимательно находите продукт, сопоставляя цены в крупных маркетплейсах платформы HydraЮнион. Для обслуживания юзеров имеется постоянная поддержка. В любом случае просмотрите оценку продавцов, новый каталог опубликован по ссылке http://zajalsite.com/index.php?title=Gidra onion com зеркало . Собственники маркета всегда следят за соблюдением договоров торговли в магазине.

    ReplyDelete
  54. ВПН дает возможность сделать невидимым точный адрес владельца, обеспечивая стопроцентную конфиденциальность закупки вещей. Применение Proxy в свою очередь считается 100% способом входа гидра магазин официальный сайт для свершения определенных приобретений. Персональные сведения клиента автоматически содержатся на главном прокси-сервере Хидра.

    ReplyDelete
  55. Вот здесь гидра сайт цены Мозырь находится действенный каталог продаваемого товара. На HydraЮнион есть на удивление в избытке востребованного товара, доступного всем юзерам инете. На проекте UnionГИДРА очень трудно закупить товар обычным вариантом, а оплату принимают только на криптовалютный кошелек.

    ReplyDelete
  56. Крупный интернет портал для отдыха в рунете – Гидра открытая ссылка гидры

    ReplyDelete
  57. В данном случае можно закупить различные вещества, мобильную технику или персональную информацию. Разыскать определенный продукт довольно легко – возможно сравнить стоимость, либо открыть ранг реализаторов. Профессиональные реализаторы магазина ЮнионHYDRA имеют конкретный ранг, что доступен всем покупателям маркета. На портале https://onion.hyrda-ssilka.com юзеры могут покупать продукцию в розницу, или большими партиями.

    ReplyDelete
  58. Как безвредно войти на сайт интернет-магазина Hydra в настоящем году https://onion.hydraclubbiokn.com

    ReplyDelete
  59. Доля архивов или услуг платные, но множество проведения досуга находятся в формате демонстрационных данных. На странице http://foodservis.ru/projects/foodservis/forum/user/17034/ кроме того лежит большое число занятной информации – тематические обучающие курсы, дистрибутивы и маркетплейс с товарами. Проект «Гидра» способствует соратникам инета подбирать единомышленников при помощи общения на привлёкшую их тематику.

    ReplyDelete
  60. Каждый посетитель сумеет зарегистрироваться на сайте и защищённо провести операцию на определенную сумму. Гидра предоставляет всем посетителям большой состав гаджетов по наиболее приличной цене от поставщика. На сайте имеется действительно много поставщиков классного продукта. Постоянным покупателям onion сайты гидра доступны акции.

    ReplyDelete
  61. Интерактивная площадка https://onion.xn--hydrclubbioknik-qjb.com дает возможность получить какой угодно товар максимально оперативно. Кроме безопасности при покупках юзеры слишком часто стремятся затаить персональную информацию. Беспроцентные покупки в сети интернет являются приоритетом для каждого онлайн-магазина.

    ReplyDelete
  62. На Гидра принимают проплаты ПайПал и дополнительно переводом на смартфон. Виртуальные денежные средства начисляют на аккаунт пользователя. Самым оперативным видом проплат на этот момент есть токены. Увеличение баланса любого юзера проводится отдельно. Для закупа на гидра официальный hydparu zerkalo site Мещовск принимают какие угодно варианты интерактивных денежных средств.

    ReplyDelete
  63. В мировой паутине более чем достаточно современных маркетплейсов. Наиболее крупный интернет рынок в интернете располагается на платформе hydra список зеркал 2022. Различные клиенты магазинов выбирают закупляться абсолютно безопасно. Отыскивая в сети нужные товары, пользователь в итоге сталкивается с платформой ГидраРУ.

    ReplyDelete
  64. Особенно современные Указания по защите домашнего ПК hydra гидра официальный сайт hydraruzxpnew4af

    ReplyDelete
  65. С целью обеспечения вспомогательной защиты возможно воспользоваться помощью гаранта. На форуме http://www.bodyweb.com/member.php?u=88343 функционирует надежный механизм охраны. В случае если поставщик не направит товар, то его аккаунт будет оперативно ликвидирован на портале Hydra RU. Руководство маркета HydraRU без устали следит за точным осуществлением проходящих контрактов.

    ReplyDelete
  66. Стоимость подобного материала как правило низкая фанера ламинированная купить в Минске. Во время применения ненатуральной клеящей основы листы фанеры не разбухнут под действием внешних факторов или сильной влажности. Из-за перпендикулярно сопоставленных волокон влагоупорный подтип фанеры практически равен по жесткости настоящей древесине.

    ReplyDelete
  67. В настоящее время есть в наличии большое множество электронных платежных систем. Особо легкий метод анонимного перевода электронных платежей – это посетить https://official.hydramarketplace.com. Отдать денежки иному пользователю или нужной фирме можно различными способами.

    ReplyDelete
  68. Море реализаторов и актуальные цены – это первые позитивные факторы, вследствие чего люди закупают вещи на ГидраUnion. ЮнионHYDRA числится очень популярным сайтом, реализующий продукты индивидуального потребления. Огромный онлайн-магазин оригинальный сайт hydra находится в невидимой сфере сети интернет.

    ReplyDelete
  69. Любые подвиды поставляемой фанеры качественно противостоят влаге, неблагоприятным погодным условиям, одновременно с этим листы остаются исходно жесткими. Главная область использования - обустройство кровли, помещений и времянок, сараев поверхностная отделка фасадов зданий. Существует несколько типов ФСФ плиты, каждая из которых обладает конкретными свойствами фанера фсф 3 3.

    ReplyDelete
  70. Качественный ламинат бывает "под дерево", в виде натурального камня или керамической плитки. Неоднократно наблюдается ламинированная плоскость фанеры уникальной, оригинальной строения и рисунка. Принципиальным отличием ламинированного покрытия https://fanwood.by/shop/fof-fanera/ является не исключительно хорошее противостояние конденсату, а также наличие особой цветовой гаммы.

    ReplyDelete
  71. огромное число заказчиков наблюдают проблему анонимного платежа денежных единиц. Работа на удаленке, возьмем например, фрилансером, многочисленные пользователиПрисутствует значительное множество сайтов, дающих возможность перенаправить денежные средства абсолютно без личных данных hydra зеркало. Заплатить без учетный перевод в сети тяжело, между тем, весьма реально.

    ReplyDelete
  72. Большинство людей в курсе о маркете Гидра РУ, вместе с тем зайти на него очень запутано. Клиенту нет необходимости подвергать самого себя опасности, проводя договор с продавцом продукта. Всякая торговая операция на http://freezedryerforum.com/index.php?action=profile;u=206731 обещает заказчикам высочайший уровень анонимности. Анонимная покупка осуществляется только лишь в закрытой интернет-сети.

    ReplyDelete
  73. Раз вы предполагаете, что купить требуемые изделия по удобной ставке есть вариант именно на сайтах крупных маркетплейсов, то серьезно неправы. Закупайте продукцию только у ответственных продавцов на форуме Hydra. Проект http://logoldap.neteasy.pl/profile.php?lookup=163032 подает личным пользователям реально громадный перечень интересных вещей по оптимально выгодным ценам.

    ReplyDelete
  74. Главный перечень неидентификуемых платежных систем возможно подобрать в маркетплейсе тор браузер гидра hydra ru zerkalo site. Всякий клиент, переводя денежки на анонимный виртуальный кошелек, не подтвердит правоту таких махинаций. Не нужно забывать, что неидентифицируемый метод транзакции платежных средств не дает полноценной гарантии перевода. Как правило не скрывают, что в интернете находится тьма проектов где возможно транзакции денег без регистрации.

    ReplyDelete
  75. Бывает несметное количество типов ламинированная фанера купить в витебске, каждая из них отличается особыми показателями. Различные типы изготавливаемой фанеры как нельзя лучше сопротивляются влаге, неблагоприятным погодным условиям, вместе с тем листы остаются максимально жесткими. Главная область использования - восстановление кровли, торговых павильонов и времянок, сараев поверхностная облицовка фасадов объектов.

    ReplyDelete
  76. Существует большое количество типов качественной фанеры, какой именно и является ламинированная ФОФ. Обклеенная с одной или двух сторон ламинированной пленкой, фанера получает возможность максимально противостоять дождю. http://fddzyab.vidown.cn/bbs/home.php?mod=space&uid=445215 считается без преувеличения распространенным облицовочным сырьем в строительной сфере.

    ReplyDelete
  77. Для оплаты продукта http://fddxbhy.vidown.cn/bbs/home.php?mod=space&uid=442601, в общем случае, практикуют криптовалютные платежи. Оплачивать нужный товар на Hydra RU запросто посредством электронных денег или криптовалюты. Все пользователи получают Гидры 100% защиту от собственников проекта. Средства при оформлении направляются на временный счет продавца, а после добычи вещей – вернутся продавцу.

    ReplyDelete
  78. Thanks for your post. I’ve been thinking about writing a very comparable post over the last couple of weeks, I’ll probably keep it short and sweet and link to this instead if thats cool. Thanks.
    cyber security course malaysia

    ReplyDelete
  79. Не на каждом шагу надо указывать индивидуальные данные, стоит именно использовать особую систему платежей. Наиболее раскрученные системы электронных платежей требуют полноценной проверки клиентов. Приобрести анонимность получится всего лишь на индивидуальной платформе http://bbs.maxthon.cn/home.php?mod=space&username=akubef.

    ReplyDelete
  80. Различные виды производимой фанеры отлично противодействуют влаге, неблагоприятным погодным условиям, вместе с тем листы остаются максимально прочными. Основная область применения - возведение кровли, торговых павильонов и времянок, сараев внешняя облицовка фасадов сооружений. Распространено несметное количество видов ФСФ плиты http://xn----7sbaa0corncdgm.xn--p1ai/index.php?subaction=userinfo&user=amyfajo, каждая из них обладает конкретными показателями.

    ReplyDelete
  81. Как покупать на сайте ГидраРУ гидра сайт ссылка hydra9webe 2022

    ReplyDelete
  82. Как закупаться на платформе Hydra как купить на гидре 2022

    ReplyDelete
  83. Используйте лишь только гидра браузер зеркало 2022 чтобы войти на центральный проект Гидра. Во время внедрения кибер-мошенников юзер абсолютно не определит, что на персональном ПК находится сторонний человек. Получить доступ к дебетовым картам клиента для хорошего мошенника проще простого. Основным заданием злоумышленников считается атака стационарного ПК.

    ReplyDelete
  84. Благодаря интегрированной протекции человек сможет без особых усилий скачивать тематическую информацию в инете. Существует большое множество актуальных веб-серферов, которые в режиме онлайна прерывают потуги нападение на ваш ПК или умного девайса. Найти адрес коннекта в инет используя TOR абсолютно исключено. Интернет веб-обозреватель ТОР подсоединяется https://hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid.onion-a.com через огромнейшее число интерактивных серверов.

    ReplyDelete
  85. В мире цифровых способов управления слишком просто стать целью взломщиков. Большей частью хакеры производят взлом юзеров на предмет финансового интереса. Интерактивный проект гидра сайт zerkalo onion 2022 com – это надежный ассистент борьбы с хакерскими атаками. Взломщики осуществляют преступные операции по различным поводам.

    ReplyDelete
  86. В наши дни присутствует невероятное число виртуальных платежных систем. Максимально элементарный способ анонимного выплаты электронных счетов – это отыскать информацию на рабочая гидра hydra ru zerkalo site. Отправить денежные средства иному человеку или определенной фирме очень просто различными способами.

    ReplyDelete
  87. Как оперативно зарегиться на портал Hidra с ПК как зайти на гидра онион

    ReplyDelete
  88. Проверенный антивир можно взять на странице https://onion.hydraruzxpnew4afc.com. Последние пакеты антивирусных базы в кратчайшие сроки осмотрят ваш ПК и спасут от программ шпионов. Защита от вирусов, загруженная на персональном ПК пользователя, тоже не помешает.

    ReplyDelete
  89. Получить анонимность реально лишь на конкретной площадке https://magazin.hydraruzxpnew4afk.com. Лишь популярные виртуальные кошельки потребуют длительной верификации клиента. Не в каждой электронной системе понадобится показывать паспортные данные, прийдется лишь только подобрать выгодную систему платежей.

    ReplyDelete
  90. Какие бывают типы интернет безопасности hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid гидра через зеркало

    ReplyDelete
  91. Отдать денежную сумму конкретному пользователю или нужной компании реально какими угодно вариантами. Особенно легкий вариант персонального выплаты электронных счетов – это отыскать информацию на hydra сайт. На текущий момент имеется большое множество цифровых кошельков.

    ReplyDelete
  92. Приобрести незаметность можно только на общественной платформе https://onion-magazin.r-hydra.com. Не в каждой платежной системе придется предоставлять личные данные, нужно лишь только отыскать специальную систему платежей. Непосредственно раскрученные системы виртуальных платежей потребуют необходимой подтверждения клиента.

    ReplyDelete
  93. Создание криптовалюты дало шанс всем юзерам магазина https://hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid.onion-k.com проводить защищенные соглашения на каком угодно расстоянии. Для приобретения веществ в маркете ЮнионHYDRA используют виртуальные платежные системы, а также криптографию. Посетителю нет причины самостоятельно встречаться с дилером, любую покупку возможно оплатить удаленно.

    ReplyDelete
  94. Благодаря прогрессивной рекламной акции о Hydra знают много пользователей в глобальной сети. С целью проведения 100% уровня надежности на http://81jdrc.com/home.php?mod=space&uid=314024 нужно реализовать исчерпывающие меры. Частная информация клиентов исключительно в кодированном варианте на удаленном сервере. IT разработчики интернет-магазина озаботились об охране активных покупателей.

    ReplyDelete
  95. Делайте только лишь скрытные способы проплаты продукции. Зеркала для логина на площадку Гидра постоянно добавляются. Немыслимый список товаров https://domikplus.com.ua/users/ajonoce буквально поражает воображение. Покупателям сети представлены десятки торговцев с разнообразными товарами. В целях идентификации на портале Hydra потребуется применять зеркальные ссылки основной страницы Гидра РУ.

    ReplyDelete
  96. Влагонепроницаемую фанерные плиты https://fanwood.by/shop/fk-fanera/berezovaya/ используют в качестве декоративной покрытия мебели, при внутренних ремонтных работ, для внутреннего покрытия кабин грузовых автомобилей. Чаще всего для производства фанеры используют два-три типов деревянной стружки отличных по плотности видов деревянной породы, но попадается и чисто березовая фанера. Высокопрочная пленка из полиэтилена абсолютно не впитывает конденсат, поэтому её зачастую используют в местах с высокой влажностью, к примеру, сауна. Покрытые пленкой виды обладают большей износостойкостью, чем их похожие варианты без ламинированного слоя.

    ReplyDelete
  97. С целью организации стопроцентной степени кибербезопасности на http://apk-uk.kz/index.php?subaction=userinfo&user=oqaguxabe придется принять неотложные меры. Собственная информация посетителей только лишь в шифрованном виде на удаленном компе. За счет хорошей рекламной компании о Hydra узнают множество пользователей в интернете. Компьютерные специалисты интерактивного магазина позаботились о защите всех пользователей.

    ReplyDelete
  98. Масса грамотных продавцов направляют свою продукцию в любом направлении России. Для реализации закупки человеку достаточно зарегистрироваться на главной площадке. Подтвердить честность поставщика можно по мнениям на сайте http://voda.zp.ua/index.php?subaction=userinfo&user=yxajici. Войти на платформу Hydra RU запросто при помощи какого угодно смартфона, либо ноутбука.

    ReplyDelete
  99. Удаленная работа, возьмем например, фрилансер, многие заказчикиСуществует большое множество компаний, дающих возможность направлять средства практически анонимно http://putevoditel-altai.ru/index.php?subaction=userinfo&user=adavale. Заплатить скрытный перевод в инете тяжело, между тем, по факту осуществимо. большинство сталкиваются с проблемой персонального платежа денег.

    ReplyDelete
  100. Как закупать на форуме Хидра гидра сайт даркнет Северодвинск

    ReplyDelete
  101. На странице http://www.violinstudy.net/home.php?mod=space&uid=1313709&do=profile люди имеют возможность приобретать вещи в розницу, и крупнооптовыми партиями. Высококвалифицированные продавцы маркетплейса Гидра РУ обладают определенным показателем, что отображается всем юзерам проекта. В данном случае можно купить особые субстанции, мобильные гаджеты или конфиденциальную информацию. Купить нужный товар на удивление несложно – допускается сопоставить стоимость, либо открыть оценки продавца.

    ReplyDelete
  102. Руководство портала Гидра ежеминутно глядит за точным осуществлением всех договоров. На сайте http://czyzyny.org.pl/profile.php?lookup=2509 реализована надежный механизм охраны. Для предоставления дополнительной безопасности возможно воспользоваться сервисом гаранта. Только если продавец не направит посылку, то его магазин будет мгновенно закрыт на портале HydraRU.

    ReplyDelete
  103. Зарегистрироваться на http://greencor32.ru/index.php?subaction=userinfo&user=ikoti довольно легко при помощи новейшего браузера TOR. Для быстрого соединения с виртуальным серваком маркетплейса понадобится быстрый прокси. Мультиканальная переадресация разрешит авторизироваться на сайте моментально и безопасно. Вспомогательно допускается применить невидимость при регистрации на портале Hydra RU.

    ReplyDelete
  104. Можно ли зайти на портал интерактивного маркета HydraRU в анонимном режиме http://mpetcu.com/member.php?action=showprofile&user_id=8789

    ReplyDelete
  105. На текущий момент 90 процентов всех коммерческих договоренностей реализуют в инете. Интернет-магазин торгует уже более 5 лет, и за такой срок сумел охарактеризовать себя в качестве крутой торговой площадки. Hidra – это огромнейший интернет-магазин, в каком можно приобрести потребные гаджеты по действительно низкой стоимости. На портале http://ooo-esk.ru/index.php?subaction=userinfo&user=yhohala вы можете отыскать вещи на свой вкус и цену.

    ReplyDelete
  106. HydraRU дает своим пользователям немыслимый состав вещей по максимально низкой цене от производителей. Тот или иной юзер может авторизироваться на портале и скрытно выполнить закупку на потребную сумму. На платформе есть невероятно много производителей высококачественного продукта. Постоянным посетителям hydra pharma 2022 доступны льготы.

    ReplyDelete
  107. Большой развлекательный проект Hydra http://bneinoah.ru/forum/user/68475/

    ReplyDelete
  108. Криптовалюта – это максимально доступный вариант проплатить покупку на Гидра. Для оплаты можно использовать биток и этериум. Для защищенной сделки товара часто применяют биткоины. Плата за вещи на сайте http://ttjg.ca/member/index.php?uid=imyketydo выполняется в любом случае в онлайн виде. Пополнить баланс без проблем возможно в персональном кабинете посетителя по завершении регистрации.

    ReplyDelete
  109. Интернет-магазин Гидра дает любым юзерам прекрасную степень безопасности при осуществлении конкретного контракта. Воспользовавшись площадкой https://hydra.e-onion.net посетители обретают наивысший уровень анонимности. Лишь нужно пройти регистрацию на портале HydraRU, и пользовательская информация направится на хранение в зашифрованном формате на облачном компе.

    ReplyDelete
  110. Есть множество средств спасти стационарный компьютер от атаки хакеров. Обратитесь к блогу, где реально прочитать действенные советы опытных юзеров. Большинство способов, что вы найдете на сайте hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid рубли на биткоины гидре как, максимально актуальные. Как уберечь себя от сетевой атаки, можно прочесть небольшое количество грамотных мнений.

    ReplyDelete
  111. Высокоточные файерволы – лучшая охрана от проникновения мошенников в вашу сеть интернет. Реализовывать непробиваемую защиту рабочего компа стоит с выбора качественного интернет-провайдера. Компании, что обеспечивают интернет сообщение, давненьки организовывают в своих комплексах специальную защиту от атак мошенников, детальный перечень можно глянуть на гидра телеграм Нариманов.

    ReplyDelete
  112. Всем покупателям магазина гидра ссылка на сайт зеркало 2022 представлен большой запас софта, которые невозможно купить в обычном магазине. Платформа обладает значительным числом преимуществ, в числе которых требуется указать высокую степень защиты осуществляемых соглашений. Магазин HydraЮнион реализует первоклассную продукцию на всей стране.

    ReplyDelete
  113. Hidra является действительно востребованным сайтом, где продают товары специального потребления. Огромное число продавцов и приемлемые ценники – это первые положительные факторы, по которой причине заказчики закупают посылки на Хидра. Крутой онлайн-магазин https://forums.eugensystems.com/memberlist.php?mode=viewprofile&u=256971 находится в даркнете.

    ReplyDelete
  114. Порядок безликих оплат на маркетплейсе ГидраРУ http://www.gymnation.co.nz/profile/15639-ubused/

    ReplyDelete
  115. Удивительный развлекательный сайт «Гидра» hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid гидра ссылка hydra9webe com

    ReplyDelete
  116. Опционально допускается применить инвиз при регистрации на портал HydraRU. Интеллектуальная маршрутизация разрешает авторизироваться на сайт оперативно и безопасно. Для высокоскоростного соединения с центральным серваком портала понадобится хороший proxi. Войти на http://www.menudanatura.com/2016/11/inocutis-tamaricis-pat-fiasson-niemela.html реально с помощью уникального браузера TOP.

    ReplyDelete
  117. На платформе ГидраРУ представлено громадное число продуктов какого угодно функционала. Огромнейшее количество обязательных продавцов hydra зеркало сайта 2022 обеспечат фирменный товар по выгодному тарифу. Доставка товаров из Hydra RU реализовывается на всей Российской Федерации. Надежный маркетплейс проводит специфическую деятельность уже более 6 лет и как и прежде активно совершенствуется.

    ReplyDelete
  118. Индивидуальные приобретения продукции – как работать с сайтом Hydra в даркнете hydra darknet 2022

    ReplyDelete
  119. Вообще не секрет, что в сети присутствует море порталов где есть варианты вывода денежек без верификации. Любой человек, переведя персональные средства на анонимный электронный кошелек, не подтвердит правоту этих махинаций. Общий каталог неидентифицируемых платежных кошельков есть возможность подобрать в маркетплейсе hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid гидра биткоин. Стоит не забывать, что неидентифицируемый вариант транзакции платежей не дает стопроцентной гарантии соглашения.

    ReplyDelete
  120. Зрелищный онлайн проект для отдыха в рунете – Гидра hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid как купить на гидре первый

    ReplyDelete
  121. I really loved reading your blog. It was very well authored and easy to understand. Unlike other blogs I have read which are really not that good.Thanks alot!
    data analytics courses in hyderabad with placements

    ReplyDelete
  122. На просторах гидра онион Городец вы подыщите громадной количество забав, и даже серьезный портал для общения с единомышленниками онлайн общества. Можно учитывать, что огромнейшее количество игроков стремятся найти специфические интерактивные сайты. Как правило люди в интернет-сети играют в онлайн игры.

    ReplyDelete
  123. На портале http://blog.edavoda24.ru/index.php?subaction=userinfo&user=icovic есть в наличии обширный запас товаров на любой вкус. Компьютерные детали и даже программное обеспечение нужно покупать по интернету. Современный человек покупает практически значительное число вещей через интернет. Существует особенная продукция, выкупить какую возможно лишь удаленным способом.

    ReplyDelete
  124. Маркетплейс ГидраРУ гарантирует всякому юзеру прекрасный уровень анонимности при совершении любой транзакции. Нужно лишь залогиниться на портале HydraRU, и личная информация направится на хранение в закодированном формате на виртуальном компе. Благодаря сервису https://www.hzhgx.cn/space-uid-950.html юзеры обретают высочайшую степень безопасности.

    ReplyDelete
  125. Более важным видом оплаты сегодня будет биткоины. Залив баланса определенного пользователя происходит индивидуально. На Hydra взимают проплаты Юмани и дополнительно переводом на мобильный телефон. Для покупок на hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid гидра онион hydra9webe com применяют какие угодно типы электронных денежных средств. Интерактивные денежные средства зачисляются в личном кабинете клиента.

    ReplyDelete
  126. Профессиональные дилеры маркетплейса Hidra обладают соответствующим рангом, он доступен каждому клиенту маркетплейса. Тут имеется шанс купить особые субстанции, бытовую технику и важную информацию. На сайте https://pmiren.com/community/home.php?mod=space&uid=520 посетители сумеют покупать продукт поодиночке, или значительной партией. Найти требуемый товар очень легко – допускается просмотреть цену, либо посмотреть оценку продавцов.

    ReplyDelete
  127. It would help if you thought that the data scientists are the highest-paid employees in a company.data science course in kochi

    ReplyDelete
  128. Data analysis and data mining are used for this purpose. You might be new in this field, so you have no idea about these terms.

    ReplyDelete
  129. Are you looking for a Data Science course that will aid you in your career growth. 360DigiTMG is the right place for you. Enroll now for a better tomorrow.
    business analytics course in lucknow

    ReplyDelete
  130. Are you not ready to risk your and your family's health this pandemic time by joining an offline Data Analyst course. we have a solution for you, enroll in an online Data Analyst course that will equip you with all the knowledge needed for a job in just 6 months.

    Business Analytics Course in Jodhpur

    ReplyDelete
  131. Superb article and valuable information because it’s helpful for me. Thanks for sharing wonderful information. Buy Instagram Followers Dubai

    ReplyDelete

  132. Informative post. Thank you sharing. Please visit our website to learn new courses.

    ReplyDelete