Create method that prevents code repetition in ASP.NET with SQL

1

I'm building a website in ASP.NET, using C #. I want to 'link' the site information (text and images) to a SQL Server database. That part of the connection I've been able to do successfully.

However, I have to repeat BD connection encoding for each group of labels and images on my site, and this is generating unnecessary code repetition. I would like help to create a method that solved my problem, and that did not make me repeat codes unnecessarily.

HTML code for my aspx page:

 <div class="row">
        <div class="col-lg-4">
            <!-- MÓDULO 1-->

            <asp:Image ID="Image1" runat="server" />
            <h2><asp:Label ID="lbl_modulo1" runat="server"></asp:Label></h2>
            <p><asp:Label ID="lbl_texto_modulo1" runat="server"></asp:Label></p>
            <a href="#" class="btn btn-primary">Saiba Mais</a>
            <!--FIM do MÓDULO 1-->
        </div>

        <div class="col-lg-4">
            <!-- MÓDULO 2-->
            <asp:Image ID="Image2" runat="server" />
            <h2><asp:Label ID="lbl_modulo2" runat="server"></asp:Label></h2>
            <p><asp:Label ID="lbl_texto_modulo2" runat="server"></asp:Label></p>
            <a href="#" class="btn btn-primary">Saiba Mais</a>
            <!--FIM do MÓDULO 2-->
        </div>

        <div class="col-lg-4">
            <!-- MÓDULO 3-->
            <asp:Image ID="Image3" runat="server" />
            <h2><asp:Label ID="lbl_modulo3" runat="server"></asp:Label></h2>
            <p><asp:Label ID="lbl_texto_modulo3" runat="server"></asp:Label></p>
            <a href="#" class="btn btn-primary">Saiba Mais</a>
            <!--FIM do MÓDULO 3-->
        </div>

    </div>

And here's the code in C #, used for connecting to a bank:

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

    //CONEXÃO COM BANCO        
    string connStr = @"DATA SOURCE = .\SQLEXPRESS; Initial Catalog = website; USER Id = sa; Password = 123456;";
    SqlConnection conn = new SqlConnection(connStr);

    conn.Open();

    //CRIAÇÃO DO COMANDO
    SqlCommand cmd = new SqlCommand("SELECT IMAGEM_CAMINHO, TITULO, TEXTO FROM [dbo].[PAG_SITE] WHERE ID='1'");
    cmd.CommandType = System.Data.CommandType.Text;
    cmd.Connection = conn;

    string imagem = "";
    string titulo = "";
    string texto = "";

    //LENDO DO BANCO
    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        imagem += reader["IMAGEM_CAMINHO"].ToString();
        titulo += reader["TITULO"].ToString();
        texto += reader["TEXTO"].ToString();
    }
    conn.Close();

    Image1.ImageUrl += imagem;
    lbl_modulo1.Text = titulo;
    lbl_texto_modulo1.Text = texto;

    //-----------------------------------------------------------------------------------------

    conn.Open();

    //CRIAÇÃO DO COMANDO
    SqlCommand cmd2 = new SqlCommand("SELECT IMAGEM_CAMINHO, TITULO, TEXTO FROM [dbo].[PAG_SITE] WHERE ID='2'");
    cmd2.CommandType = System.Data.CommandType.Text;
    cmd2.Connection = conn;

    string imagem2 = "";
    string titulo2 = "";
    string texto2 = "";

    //LENDO DO BANCO
    SqlDataReader reader2 = cmd2.ExecuteReader();
    while (reader2.Read())
    {
        imagem2 += reader2["IMAGEM_CAMINHO"].ToString();
        titulo2 += reader2["TITULO"].ToString();
        texto2 += reader2["TEXTO"].ToString();
    }
    conn.Close();

    Image2.ImageUrl += imagem2;
    lbl_modulo2.Text = titulo2;
    lbl_texto_modulo2.Text = texto2;

    //-----------------------------------------------------------------------------------------

    conn.Open();

    //CRIAÇÃO DO COMANDO
    SqlCommand cmd3 = new SqlCommand("SELECT IMAGEM_CAMINHO, TITULO, TEXTO FROM [dbo].[PAG_SITE] WHERE ID='3'");
    cmd3.CommandType = System.Data.CommandType.Text;
    cmd3.Connection = conn;

    string imagem3 = "";
    string titulo3 = "";
    string texto3 = "";

    //LENDO DO BANCO
    SqlDataReader reader3 = cmd3.ExecuteReader();
    while (reader3.Read())
    {
        imagem3 += reader3["IMAGEM_CAMINHO"].ToString();
        titulo3 += reader3["TITULO"].ToString();
        texto3 += reader3["TEXTO"].ToString();
    }
    conn.Close();

    Image3.ImageUrl += imagem3;
    lbl_modulo3.Text = titulo3;
    lbl_texto_modulo3.Text = texto3;              

    }
 }
    
asked by anonymous 15.05.2017 / 16:10

4 answers

1
 //CONEXÃO COM BANCO        
        string connStr = @"DATA SOURCE = .\SQLEXPRESS; Initial Catalog = website; USER Id = sa; Password = 123456;";
        SqlConnection conn = new SqlConnection(connStr);
        SqlCommand cmd = new SqlCommand(@"SELECT IMAGEM_CAMINHO, TITULO, TEXTO FROM [dbo].[PAG_SITE] WHERE ID IN ('1', '2', '3')", conn);
        SqlDataAdapter adpt = new SqlDataAdapter(cmd);

        DataTable tb = new DataTable();
        adpt.Fill(tb);

        for(int i =0; i < tb.Rows.Count; i++)
        {
            var img = this.FindControl("Image" + (i+1)) as Image;
            var lbl = this.FindControl("lbl_modulo" + (i+1)) as Label;
            var lbltexto = this.FindControl("lbl_texto_modulo" + (i+1)) as Label;

            img.ImageUrl = tb.Rows[i]["IMAGEM_CAMINHO"] as string;
            lbl.Text = tb.Rows[i]["TITULO"] as string;
            lbltexto.Text = tb.Rows[i]["TEXTO"] as string;
        }
    
15.05.2017 / 21:59
1

As a good programming practice it would be more interesting to create a three tier system. Where each layer fulfills its responsibility.

  

Presentation Layer

HTML and calls the business layer in CodeBehind

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


            RegrasNegocio obj = new RegrasNegocio();
            Tipo Retorno = new Tipo();

            //Chama a camada de negócio
            Retorno = obj.Consultar(1);

            // Utiliza o objeto de retorno
            Image1.ImageUrl += Retorno.IMAGEM_CAMINHO;
            lbl_modulo1.Text = Retorno.TITULO;
            lbl_texto_modulo1.Text = Retorno.TEXTO;

 //Chama a camada de negócio
            Retorno = obj.Consultar(2);

            // Utiliza o objeto de retorno
            Image2.ImageUrl += Retorno.IMAGEM_CAMINHO;
            lbl_modulo2.Text = Retorno.TITULO;
            lbl_texto_modulo2.Text = Retorno.TEXTO;

 //Chama a camada de negócio
            Retorno = obj.Consultar(3);

            // Utiliza o objeto de retorno
            Image3.ImageUrl += Retorno.IMAGEM_CAMINHO;
            lbl_modulo3.Text = Retorno.TITULO;
            lbl_texto_modulo3.Text = Retorno.TEXTO;

        }
    }
  

Business layer

Where you assign all the business rules of your system, such as validations.

 public class RegrasNegocio
    {

        public Tipo Consultar(Int32 ID)
        {

            AcessoDados obj = new AcessoDados();
            Tipo Retorno = new Tipo();

            try
            {

                // Regras de negócio

                if (ID == 0)
                    throw new Exception("ID não informado.");

                //Chama a camada responsável pelo acesso aos dados e conexão com o banco
                Retorno = obj.ConsultarPorID(ID);

                return Retorno;

            }
            catch (Exception)
            {

                throw;
            }

        }


    }
  

Data Access Layer

Connection to the database and calls to it.

class AcessoDados
    {

        public Tipo ConsultarPorID(Int32 ID)
        {

            // Criação do objeto tipo para retorno do método
            Tipo Objetoretorno = new Tipo();


            //CONEXÃO COM BANCO        
            // Adicionar Referência System.Configuration.ConfigurationManager, Retorna a string do web Config
            string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["root"].ConnectionString;  
            SqlConnection conn = new SqlConnection(connStr);

            conn.Open();

            //CRIAÇÃO DO COMANDO
            SqlCommand cmd = new SqlCommand("SELECT IMAGEM_CAMINHO, TITULO, TEXTO FROM [dbo].[PAG_SITE] WHERE ID=@ID"); // Utilize Procedures SLQ 

            // Utilize paramentros para o método ser dinâmico
            cmd.Parameters.Add("@ID", SqlDbType.Int).Value = ID; 

            cmd.CommandType = System.Data.CommandType.Text;
            cmd.Connection = conn;

            //LENDO DO BANCO
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                Objetoretorno.IMAGEM_CAMINHO = reader["IMAGEM_CAMINHO"].ToString();
                Objetoretorno.TITULO = reader["TITULO"].ToString();
                Objetoretorno.TEXTO = reader["TEXTO"].ToString();
            }

            conn.Close();

            //Retorna um objeto que vai ser utilizado no codeBehind
            return Objetoretorno;

        }

    }
  

Support Layer Type object that represents an entity

 public class Tipo
    {
        public String IMAGEM_CAMINHO { get; set; }
        public String TITULO { get; set; }
        public String TEXTO { get; set; }

    }
    
15.05.2017 / 21:27
0

The connection can be a C # class (Models / DataAcess.cs). DataAcess.cs file

public class DataAcess{
   public DataAcess(){
      //Colque sua String de Conexão  aqui
      //Retorne a variavel de conexao.
   }

In your Code Page_Load you will do the following

//Chama seu Model DataAcess
var conexao = DataAcess();
conexao.Open();
    
15.05.2017 / 16:28
0

Ideally, you should use the ConfigurationManager, ie store the connection string in your site's web.config:

  • Put the connection string in your WebConfig:

      <connectionStrings>
            <add name="root" connectionString="Server=localhost;Database=seubanco;User ID=root;Password=suasenha;"/>
        </connectionStrings>
    
  • No Code Behind or Class that will use the connection you include the System.Configuration namespace:

    using System.Configuration;
    
  • Then just assign to a string by calling the web.config connection

    string connStr = ConfigurationManager.ConnectionStrings ["root"]. ConnectionString;         SqlConnection conn = new SqlConnection (connStr);     

  • 15.05.2017 / 16:41