Desenvolvimento de Website com ASP.NET e SQL Server – Parte 1

Olá caro leitor!

Estamos iniciando uma serie de artigos que tem como objetivo lhe mostrar o passo a passo da criação de um website utilizando ASP.NET e SQL Server.

Caso queira acessar as outras partes, veja os links abaixo:

Nessa primeira parte iremos criar nosso banco de dados, as tabelas, camada de conexão, camada de entidades e a camada de regras de negocio. Então vamos ao que interessa.

Inicialmente criaremos o nosso banco de dados então para isso abra o Microsoft SQL Manager e crie-o conforme imagem abaixo.

Agora criaremos nossa tabela. A principio será somente 1 (uma) tabela. Segue abaixo o script:


CREATE TABLE PAGINAS
(
	ID_PAGINA INT IDENTITY(1, 1) NOT NULL,
	TITULO_PAGINA VARCHAR(40) NOT NULL,
	TEXTO_PAGINA VARCHAR(MAX),
	DATACRIACAO_PAGINA DATETIME,
	ATIVO_PAGINA INT,
	PRIMARY KEY(ID_PAGINA)
) 

Vamos inserir alguns dados iniciais.


INSERT INTO PAGINAS(TITULO_PAGINA, TEXTO_PAGINA, DATACRIACAO_PAGINA, ATIVO_PAGINA)
VALUES('Empresa', 'Conteudo da página sobre a empresa', GETDATE(), 1)

INSERT INTO PAGINAS(TITULO_PAGINA, TEXTO_PAGINA, DATACRIACAO_PAGINA, ATIVO_PAGINA)
VALUES('Serviços', 'Conteudo da página de serviços', GETDATE(), 1)

O fato de termos somente uma tabela é que nela teremos todas as páginas e seus conteúdos cadastrados. Nosso website terá a flexibilidade de criar, alterar, excluir e ativas ou desativas as páginas.

Futuramente criaremos uma pagina que listará produtos e para isso criaremos uma segunda tabela. Mais isso veremos em um próximo artigo.

Agora abra o Visual Studio e crie uma nova Solution clicando no menu File > New > Project…

Para minha solution darei o nome de ProjetoWebSite.

Após isso, criaremos nosso primeiro. Esse projeto terá como objetivo a manipulação de dados utilizando o SQL Server.

Clique com o botão direito em cima da solution e clique na opção Add > New Project…

Feito isso, siga os passo conforme a imagem abaixo selecionando Windows > Class Library e defina um nome para o projeto. No meu caso escolhi WebSite.Data.

Com nosso projeto da camada de conexão criada, iremos implementar alguns métodos. Basicamente serão 4 (quatro) métodos e 1 (uma) propriedade. Os 4 (quatro) métodos serão para abrir e fechar conexão, retornar os dados e outro pra executar comando. Vamos ao código.


using System;
using System.Data;
using System.Data.SqlClient;

namespace WebSite.Data
{
    public class Connection
    {
        private SqlConnection Conexao;

        /// <summary>
        /// Dados de conexao para SqlServer
        /// </summary>
        public string ConnectionString { get; set; }

        public Connection() { }

        /// <summary>
        /// Construtor que recebe como parametro a ConnectionString
        /// </summary>
        /// <param name="ConnectionString"></param>
        public Connection(string ConnectionString)
        {
            this.ConnectionString = ConnectionString;
        }

        /// <summary>
        /// Abre conexao
        /// </summary>
        public void AbrirConexao()
        {
            if (string.IsNullOrEmpty(this.ConnectionString)) throw new Exception("Não foi informado a ConnectionString.");

            if (Conexao == null)
            {
                Conexao = new SqlConnection();
                Conexao.ConnectionString = this.ConnectionString;
            }

            Conexao.Open();
        }

        /// <summary>
        /// Fecha conexao
        /// </summary>
        public void FechaConexao()
        {
            if (Conexao != null &amp;&amp; Conexao.State == ConnectionState.Open)
            {
                Conexao.Close();
            }
        }

        /// <summary>
        /// Retorna os dados
        /// </summary>
        /// <param name="sql"></param>
        /// <returns>Retorna coleção de dados</returns>
        public IDataReader RetornaDados(string sql)
        {
            if (string.IsNullOrEmpty(sql)) throw new Exception("Não foi informado a query SQL.");
            if (Conexao == null || Conexao.State == ConnectionState.Closed) throw new Exception("A conexão fechada. Execute o comando AbrirConexao e não se esqueça de FecharConexao no final.");

            SqlCommand command = new SqlCommand();
            command.Connection = this.Conexao;
            command.CommandText = sql;
            IDataReader reader = command.ExecuteReader();

            return reader;
        }

        /// <summary>
        /// Executa comando
        /// </summary>
        /// <param name="sql"></param>
        /// <returns>Retorna o total de linhas afetadas</returns>
        public int ExecutaComando(string sql)
        {
            if (string.IsNullOrEmpty(sql)) throw new Exception("Não foi informado a query SQL.");
            if (Conexao == null || Conexao.State == ConnectionState.Closed) throw new Exception("A conexão fechada. Execute o comando AbrirConexao e não se esqueça de FecharConexao no final.");

            SqlCommand command = new SqlCommand();
            command.Connection = this.Conexao;
            command.CommandText = sql;
            int result = command.ExecuteNonQuery();

            return result;
        }
    }
}

Para utilização da classe, será necessário instancia-la, executar o método para abrir conexão, executar os métodos para retornar os dados ou executar comando SQL e em seguida encerrar conexão.

Essa camada de conexão é simples, de fácil entendimento e pode ser utilizado em qualquer projeto.

Com nossa camada de conexão criada, vamos à camada de entidades onde teremos todas as entidades envolvidas no projeto e que é um espelho de nossas tabelas. Inicialmente teremos somente 1 (uma) entidade. Vamos criar um novo projeto.

Clique com o botão direito em cima da solution e clique na opção Add > New Project…

Feito isso, siga os passo conforme a imagem abaixo selecionando Windows > Class Library e defina um nome para o projeto. No meu caso escolhi WebSite.Entities.

Agora vamos criar nossa entidade. Renomeie o arquivo Class1.cs para Paginas.cs que será um espelho da nossa tabela Paginas. Segue código abaixo.


using System;

namespace WebSite.Entities
{
    public class Paginas
    {
        public int Id { get; set; }
        public string Titulo { get; set; }
        public string Texto { get; set; }
        public DateTime DataCriacao { get; set; }
        public bool Ativo { get; set; }

        public Paginas()
        {

        }

        public Paginas(int Id)
        {
            this.Id = Id;
        }

        public Paginas(int Id, string Titulo, string Texto, DateTime DataCriacao, bool Ativo)
        {
            this.Id = Id;
            this.Titulo = Titulo;
            this.Texto = Texto;
            this.DataCriacao = DataCriacao;
            this.Ativo = Ativo;
        }
    }
}

Com nossa camada de entidades criada, iremos cria camada de regra de negócios. Siga os passos abaixo.

Clique com o botão direito em cima da solution e clique na opção Add > New Project…

Feito isso, siga os passo conforme a imagem abaixo selecionando Windows > Class Library e defina um nome para o projeto. No meu caso escolhi WebSite.Business.

Agora vamos criar as regras de negocio. Renomeie o arquivo Class1.cs para Paginas.cs que conterá todas as operações necessárias para manipularmos nossa tabela Paginas.

Antes de implementar os códigos, precisaremos adicionar como referencia ao nosso projeto as bibliotecas criadas anteriormente. Adicione a biblioteca WebSite.Data e WebSite.Entities clicando com botão direito em References > Add References > Projects. Na janela que segue selecione as 2 (duas) bibliotecas criadas.

Na classe Paginas, vamos adicionar as referencias.


using System.Configuration;
using System.Data;

Agora implementaremos a nossas regras conforme o código abaixo.


using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Data;

namespace WebSite.Business
{
    public class Paginas
    {
        private string ConnectionString = ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString;

        public Paginas() { }

        public Entities.Paginas[] ListaPaginas()
        {
            return ListaPaginas(null);
        }

        public Entities.Paginas[] ListaPaginas(Entities.Paginas pagina)
        {
            List<Entities.Paginas> lstPaginas = new List<Entities.Paginas>();

            Data.Connection connection = new Data.Connection(this.ConnectionString);
            connection.AbrirConexao();

            StringBuilder sqlString = new StringBuilder();
            sqlString.AppendLine("select * from paginas");

            if (pagina != null)
            {
                sqlString.AppendLine("where 1 = 1");

                if (pagina.Id > 0)
                {
                    sqlString.AppendLine("and id_pagina = " + pagina.Id + "");
                }

                if (!string.IsNullOrEmpty(pagina.Titulo) &amp;&amp; pagina.Titulo.Length > 0)
                {
                    sqlString.AppendLine("and titulo_pagina like '" + pagina.Titulo.Replace("'", "''") + "'");
                }

                if (!string.IsNullOrEmpty(pagina.Texto) &amp;&amp; pagina.Texto.Length > 0)
                {
                    sqlString.AppendLine("and texto_pagina like '" + pagina.Texto + "'");
                }
            }

            IDataReader reader = connection.RetornaDados(sqlString.ToString());

            int idxId = reader.GetOrdinal("ID_PAGINA");
            int idxTitulo = reader.GetOrdinal("TITULO_PAGINA");
            int idxTexto = reader.GetOrdinal("TEXTO_PAGINA");
            int idxDataCriacao = reader.GetOrdinal("DATACRIACAO_PAGINA");
            int idxAtivo = reader.GetOrdinal("ATIVO_PAGINA");

            while (reader.Read())
            {
                Entities.Paginas _pagina = new Entities.Paginas();
                _pagina.Id = reader.GetInt32(idxId);
                _pagina.Titulo = reader.GetString(idxTitulo);
                _pagina.Texto = reader.GetString(idxTexto);
                _pagina.DataCriacao = reader.GetDateTime(idxDataCriacao);
                _pagina.Ativo = reader.GetInt32(idxAtivo) == 1;

                lstPaginas.Add(_pagina);
            }

            connection.FechaConexao();

            return lstPaginas.ToArray();
        }

        public bool SalvaPagina(Entities.Paginas pagina)
        {
            bool salvou = false;

            if (pagina != null)
            {
                Data.Connection connection = new Data.Connection(this.ConnectionString);
                connection.AbrirConexao();

                StringBuilder sqlString = new StringBuilder();

                if (pagina.Id > 0)
                {
                    sqlString.AppendLine("update paginas set");
                    sqlString.AppendLine("titulo_pagina = '" + pagina.Titulo.Replace("'", "''") + "',");
                    sqlString.AppendLine("texto_pagina = '" + pagina.Texto.Replace("'", "''") + "',");
                    sqlString.AppendLine("ativo_pagina = " + (pagina.Ativo ? 1 : 0)  + " ");
                    sqlString.AppendLine("where id_pagina = " + pagina.Id + "");
                }
                else
                {
                    sqlString.AppendLine("insert into paginas(titulo_pagina, texto_pagina, datacriacao_pagina, ativo_pagina)");
                    sqlString.AppendLine("values('" + pagina.Titulo.Replace("'", "''") + "', '" + pagina.Texto.Replace("'", "''") + "', GETDATE(), " + (pagina.Ativo ? 1 : 0) + ")");
                }

                int i = connection.ExecutaComando(sqlString.ToString());
                salvou = i > 0;

                connection.FechaConexao();
            }

            return salvou;
        }

        public bool SalvaPagina(int Id, string Titulo, string Texto, DateTime DataCriacao, bool Ativo)
        {
            return SalvaPagina(new Entities.Paginas(Id, Titulo, Texto, DataCriacao, Ativo));
        }

        public bool ExcluiPagina(Entities.Paginas pagina)
        {
            bool salvou = false;

            if (pagina != null &amp;&amp; pagina.Id > 0)
            {
                Data.Connection connection = new Data.Connection(this.ConnectionString);
                connection.AbrirConexao();

                StringBuilder sqlString = new StringBuilder();
                sqlString.AppendLine("delete from paginas");
                sqlString.AppendLine("where id_pagina = " + pagina.Id + "");

                int i = connection.ExecutaComando(sqlString.ToString());

                connection.FechaConexao();
            }

            return salvou;
        }

        public bool ExcluiPagina(int Id)
        {
            return ExcluiPagina(new Entities.Paginas(Id));
        }
    }
}

Como pode ver, até aqui somente criamos as classes que iremos utilizar em nosso Website. Até momento nosso projeto ficou da seguinte forma.

  • WebSite.Data: Camada responsável por abrir conexão, executar comandos SQL, retornar dados e encerrar conexão.
  • WebSite.Entities: Camada responsável por manter nossas entidades que serão utilizadas em todo o projeto.
  • WebSite.Business: Camada responsável em conter todas as operações possíveis, ou seja, ela conterá no mínimo as quatro operações básicas: Criar (Create), Ler (Read), Atualizar (Update) e Excluir (Delete).

Com o que já criamos, é possível também reutiliza-lo em um projeto do tipo WinForm (Windows Form), porem nosso foco será o desenvolvimento de um website.

Vale lembrar também que a camada de conexão de dados pode ser reutilizada e modificada para a utilização de outros bancos de dados. Modificando você poderá usar os seguintes:

  • System.Data.OleDb
  • System.Data.OracleClient
  • MySql.Data.MySqlClient
  • System.Data.SQLite
  • FirebirdSql.Data.FirebirdClient

Espero que com esse primeiro artigo da serie, você possa ter uma visão melhor sobre o desenvolvimento de projetos N-Camadas e com ele ter base para iniciar outros projetos com maior facilidade e com uma visão mais ampla do todo.

No próximo artigo iniciaremos a criação de nosso website.

Faça download do projeto: Desenvolvimento de Website com ASP.NET e SQL Server - Parte 1

Não deixe de participar do fórum. Siga o C# Brasil no Twitter e Facebook.

Até o próximo artigo e bons estudos!

79 comentários sobre “Desenvolvimento de Website com ASP.NET e SQL Server – Parte 1

  1. ola Raphael, estou acompanhando esta serie e estou achando ótima,mas encontrei uma dificuldade, no projeto (Camada) de regra de negócios, referenciamos System.Data e System.configuration, porem no método:
    public Entities.Paginas[] ListaPaginas(Entities.Paginas pagina)

    quando tento colocar Data.Connecton da um erro.
    seria por causa de referencia?

  2. O system configuration já estava referenciado.
    Apaguei e referenciei novamente, mas continua dando erro.
    Ao digitar Data já aparece: Datacolumn, DataException, DataReader entre outras opções.
    Não sei se o problema realmente é referencia, mas por não aparecer a opção Data, acredito que seja, só não sei qual.

  3. Resolvido:
    Como você havia dito no Twitter no projeto website.Business fazia-se necessário Referenciar website.Data . Valeu a força.

  4. Bom dia! Estou iniciando meus estudos com asp.net e c#.
    Aqui tenho o erro ConfigurationManager does not exist.
    Estaria relacionado a alguma referência que deixei de fazer?
    Grato.

  5. Você disse que essa camada de conexão que vc criou ai, ela pode ser usada para conectar ao meu banco de dados em qualquer outro projeto.
    Como eu faria se quisesse conectar ao Banco e executar um query?,
    tipo essa:

    “select * from Cliente C where C.Cpf = 111.111.111-11”;

  6. paginas.cs é um espelho da tabela página. Minha duvida é a seguinte, preciso desenvolver um sistema que já possui um banco com cerca de 50 tabelas, terei que fazer manualmente as entidades “tabelas.cs” ? Existe alguma maneira de automatizar esse processo?

  7. Raphael boa noite,

    O projeto esta gerando erro na namespace WebSite.Business.
    No ConfigurationManager. Segui os passos que voce passou acima, e não obtive sucesso. Foi adicionado as bibliotecas WebSite.Data e WebSite.Entities dentro da References de WebSite.Business e utilizei as using no projeto.

    Obrigado

  8. Opa Resolvido.

    Eu estava referenciando using System.Configuration no classe, mas nao referenciei no projeto dentro do References. Somente adicionei a biblioteca System.Configuration dentro do projeto em References. Obrigado….

  9. “O que você poderia fazer como eu, criar uma procedure para gerar as classes.”
    ???
    Tem como mostrar o caminho das pedras ?

    1. Tem sim, a procedure ficou um pouco grande, mais segue.


      CREATE PROCEDURE MSP_GERACLASSE(@TABELA VARCHAR(100))
      AS
      DECLARE @NOME VARCHAR(100)
      DECLARE @TIPO VARCHAR(100)
      DECLARE @PARAM VARCHAR(MAX) = ''
      DECLARE @VIRGULA VARCHAR(2) = ''
      DECLARE @CODIGO VARCHAR(MAX) = ''

      print 'public class ' + @TABELA
      print '{'

      DECLARE CUR_GERA_CLASSE SCROLL CURSOR FOR
      SELECT UPPER(B.NAME) AS NOME,
      CASE
      WHEN C.NAME = 'smallint' OR C.NAME = 'INT' THEN 'int'
      WHEN C.NAME = 'datetime' THEN 'DateTime'
      WHEN C.NAME = 'varchar' OR C.NAME = 'text' OR C.NAME = 'char' THEN 'string'
      WHEN C.NAME = 'numeric' OR C.NAME = 'money' OR C.NAME = 'float' THEN 'decimal'
      WHEN C.NAME = 'bit' THEN 'bool'
      ELSE 'string'
      END AS TIPO
      FROM SYSOBJECTS A
      INNER JOIN SYS.COLUMNS B ON (B.OBJECT_ID = A.ID)
      INNER JOIN SYS.TYPES C ON (C.SYSTEM_TYPE_ID = B.SYSTEM_TYPE_ID)
      WHERE A.NAME = @TABELA
      AND C.NAME NOT IN ('timestamp')
      ORDER BY B.COLUMN_ID

      OPEN CUR_GERA_CLASSE

      FETCH FIRST FROM CUR_GERA_CLASSE INTO @NOME, @TIPO

      WHILE @@FETCH_STATUS = 0 BEGIN

      PRINT ' public ' + @TIPO + ' ' + @NOME + ' {get; set; } '

      SET @CODIGO = @CODIGO + ' this.' + @NOME + ' = ' + @NOME + ';' + char(13) + char(10)

      SET @PARAM = @PARAM + @VIRGULA + @TIPO + ' ' + @NOME
      SET @VIRGULA = ', '

      FETCH NEXT FROM CUR_GERA_CLASSE INTO @NOME, @TIPO
      END

      CLOSE CUR_GERA_CLASSE

      DEALLOCATE CUR_GERA_CLASSE

      print ''
      print ' public ' + @TABELA + '()'
      print ' {'
      print ''
      print ' }'

      IF LEN(@PARAM) > 0 BEGIN
      print ''
      print ' public ' + @TABELA + '(' + @PARAM + ')'
      print ' {'
      print @CODIGO
      print ' }'
      END

      print '}'

    1. Na verdade é uma função. Acabei de utiliza-lo e está perfeito.

      Para utiliza-la faço assim.

      select MSP_GERACLASSE('MEU_BANCODADOS', 'MINHA_TABELA');

      Segue o código da função.

      DELIMITER //

      CREATE FUNCTION MSP_GERACLASSE(BANCODADOS varchar(100), TABELA VARCHAR(100))
      RETURNS LONGTEXT DETERMINISTIC
      BEGIN

      DECLARE PROPRIEDADE LONGTEXT;
      DECLARE CONSTRUTOR LONGTEXT;
      DECLARE PARAMETROS LONGTEXT;
      DECLARE CODIGO LONGTEXT;
      DECLARE NOME LONGTEXT;
      DECLARE TIPO LONGTEXT;
      DECLARE VIRGULA LONGTEXT;

      DECLARE DONE INT DEFAULT FALSE;
      DECLARE CUR_GERA_CLASSE CURSOR FOR
      SELECT B.COLUMN_NAME AS NOME,
      CASE
      WHEN B.DATA_TYPE = 'SMALLINT' OR B.DATA_TYPE = 'INT' THEN 'int'
      WHEN B.DATA_TYPE = 'DATETIME' OR B.DATA_TYPE = 'INT' THEN 'DateTime'
      WHEN B.DATA_TYPE = 'VARCHAR' OR B.DATA_TYPE = 'TEXT' OR B.DATA_TYPE = 'CHAR' THEN 'string'
      WHEN B.DATA_TYPE = 'NUMERIC' OR B.DATA_TYPE = 'MONEY' OR B.DATA_TYPE = 'FLOAT' THEN 'decimal'
      WHEN B.DATA_TYPE = 'BIT' THEN 'bool'
      ELSE 'string'
      END AS TIPO
      FROM INFORMATION_SCHEMA.TABLES A
      INNER JOIN INFORMATION_SCHEMA.COLUMNS B ON (B.TABLE_SCHEMA = A.TABLE_SCHEMA AND B.TABLE_NAME = A.TABLE_NAME)
      WHERE A.TABLE_SCHEMA = BANCODADOS
      AND B.TABLE_NAME = TABELA
      AND A.TABLE_TYPE = 'BASE TABLE';
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = TRUE;

      SET CONSTRUTOR = '';
      SET PARAMETROS = '';
      SET PROPRIEDADE = '';
      SET TIPO = '';
      SET NOME = '';
      SET CODIGO = '';
      SET VIRGULA = '';

      SET CODIGO := CONCAT(CODIGO, 'public class ', TABELA, 'rn');
      SET CODIGO := CONCAT(CODIGO, '{', 'rn');

      OPEN CUR_GERA_CLASSE;

      READ_LOOP: LOOP
      FETCH CUR_GERA_CLASSE INTO NOME, TIPO;

      IF DONE THEN
      LEAVE READ_LOOP;
      END IF;

      /*SET CODIGO := CONCAT(CODIGO, ' [ColumnName("', NOME, '")]', 'rn');*/
      SET CODIGO := CONCAT(CODIGO, ' public ', TIPO, ' ', NOME, ' {get; set; } ', 'rn');

      SET CONSTRUTOR := CONCAT(CONSTRUTOR, ' this.', NOME, ' = ', NOME, ';', 'rn');
      SET PARAMETROS := CONCAT(PARAMETROS, VIRGULA, TIPO, ' ', NOME);
      SET VIRGULA := ', ';

      END LOOP;

      CLOSE CUR_GERA_CLASSE;

      SET CODIGO := CONCAT(CODIGO, '', 'rn');
      SET CODIGO := CONCAT(CODIGO, ' public ', TABELA, '()', 'rn');
      SET CODIGO := CONCAT(CODIGO, ' {', 'rn');
      SET CODIGO := CONCAT(CODIGO, '', 'rn');
      SET CODIGO := CONCAT(CODIGO, ' }', 'rn');

      IF LENGTH(PARAMETROS) > 0 THEN
      SET CODIGO := CONCAT(CODIGO, '', 'rn');
      SET CODIGO := CONCAT(CODIGO, ' public ', TABELA, '(', PARAMETROS ,')', 'rn');
      SET CODIGO := CONCAT(CODIGO, ' {', 'rn');
      SET CODIGO := CONCAT(CODIGO, CONSTRUTOR);
      SET CODIGO := CONCAT(CODIGO, ' }', 'rn');
      END IF;

      SET CODIGO := CONCAT(CODIGO, '}', 'rn');

      RETURN CODIGO;

      END
      // DELIMITER ;

  10. Oi, gostei muito, está muito fácil aprender assim, só estou com dúvida quanto a tabela, onde devo adicionar as condições com insert into paginas, ….

    Pode me dar uma luz? Muito obrigado

  11. No exemplo, existe um metodo que será responsavel por atualizar ou incluir nova página.
    O metodo se chama SalvaPagina.
    Nele tem uma condição que é verificada se iremos atualizar ou incluir e caso seja para incluir é executado um insert.

  12. Olá Raphael,
    Não estou conseguindo utilizar o objeto data.connection, aparecem outras opções, sei que é um problema de referencia mais já coloquei todas as referencias e nada ainda, poderia me ajudar, agradeço.

  13. Boa noite Raphael,
    Primeiramente parabéns pelo site, consegui resolver o problema realmente era referencia, valeu muito obrigado!!!

  14. Iai Rafhael,

    Estou com o seguinte problema, já pesquisei no google mais não consegui encontrar esta acontecendo nessa linha.

    private string ConnectinString = ConfigurationManager.ConnectionStrings[“DBConnection”].ConnectionString;

    msg de erro: “Referência de objeto não definida para uma instância de um objeto”.

  15. Juniorleles… Adiciona a Referencia System.Configuration ao projeto que sai esse erro… Pode acontecer de você colocar o using System.Configuration porém o projeto não referencia-lo… entao clica com o botao direito no projeto>>> Add Reference>> Clica na Aba .Net>>> procura o System.Configuration e adiciona… Eu estava com o mesmo erro Ontem e Solucionei assim… Abraço!

  16. Valeu Douglas… problema resolvido, na verdade estava com problema na connectionString no web.config conforme o Raphael falou. Só que agora estou com um problema no método ReturnarDados, ele retorna o exeption “A conexão fachada . execute o comando abrir conexão e não esqueça de fechar conexao no final”.nessa linha de código “SqlCommand command = new SqlCommand();”.

    Desculpe incomodar ai galera.

  17. Raphael, excelente artigo.
    Tenho uma dúvida, talvez básica, mas vamos lá.
    Os campos da tabela que você criou são diferentes dos campos na classe entidade e business, por exemplo banco campo “TITULO_PAGINA” na entidade “TITULO”, minha dúvida é, como é feito o mapeamento disso, como minha classe sabe que “TITULO” se refere a “TITULO_PAGINA”? Outra questão, o nome das classes devem ser idênticos ao nome da tabela? Por exemplo, tabela “Paginas” arquivo .cs nome “Paginas.cs”?

    Pergunto isso, pois utilizei o gerador de classe para MySql que você fez, e ele me gerou a classe com os nomes dos campos idênticos ao da tabela, e no seu exemplo do artigo não está e funciona. Alem disso minhas tabelas começam com tb_ então o arquivo deve se chamar “tb_produto.cs” por exemplo?

  18. Olá Luiz, tudo bem?
    Como pode perceber, no quarto bloco de código de exemplo, da linha 52 a 56 eu faço referencia aos campos da tabela. Em seguinte é feito um laço utilizando while para preencher a estrutura.
    Não necessariamente os campos da tabela precisam ter o mesmo nome e nem mesmo o nome da tabela precisa ser o mesmo.
    O gerador de classe é para facilitar o desenvolvimento e caso precise utiliza-lo, você vai precisar alterar os códigos dos exemplos do artigo.
    No caso da sua tabela se chamar tb_produto e exemplo cita a tabela com nome de Produto, basta altera-la. De qualquer forma o exemplo acima refere-se as tabelas criadas no inicio do artigo.
    Ficou claro?
    Abraço

  19. Rafael estou com um problema que deve ser facil.
    Eu crieu um blank projeto, conforme vc descreveu, depois pelo solutions add um projeto novo e a class library webSiteData e agora não consigo criar a entity, pois no solution aparece somente a webSiteData e não fica na raiz principal do solution o projetoWebsite.

    VS2010

    Obrigada

  20. Boa Noite!

    Rafael, muito obrigado pelas suas explicações com referência as dúvidas dos nobres colegas. Para mim foram de excelente utilidade.
    Estou gostando das suas explicações e continuarei acompanhando seu projeto de exemplo.

  21. Olá, Boa noite! Estou começando a programar e achei excelente esse tutorial porem estou encontrando uma dificuldade… na hora de abrir um novo projeto online, como mostra na foto, no meu c# 2010 não me dá a opção de abrir um projeto em branco. Como eu faço?

  22. Olá Raphael,
    Sou novato e estou seguindo o seu artigo que por sinal muito didático, contudo estou tendo dificuldades em colocar
    no menuControl o CodeBehind. pode me dar algumas dicas estou aprendendo mesmo e gostaria de continuar.
    Abs.

  23. Olá Raphael, obrigado pelo Post.
    Aí vai uma opinião que pode virar uma crítica construtiva:
    O seu código fonte poderia ser melhor se:
    – Fizesse tratamento de erro ( principalmente na sua cada de conexão* )

    – Não misturasse na camada de negócio comandos SQL, isso fere muito a independencia entre as camadas.

    – Retornar um boolean no retorno da execução da sua query SQL, se a operação não der certo irá retornar uma exception, se der certo não. Do jeito que está fazendo em que momento irá retornar a sua variavel como ‘false’ ?

    Abraços e feliz 2013.

    1. Obrigado Michael!
      A idéia era abordar o desenvolvimento de website. Realmente tem muita coisa que poderia ser feita.
      Quanto a divisão das camadas, não tinha a intenção de abordar a fundo o assunto.
      De qualquer forma é válida sua opinião é agradeço pois ajuda a todos a busca por outros métodos de desenvolver.
      Abraço

  24. Raphael, uma dúvida:
    Montar uma query usando ApendLine pode ocorrer SQL injection? Poderíamos proteger nossa query usando Parameters.AddWithValue(), ou não?

    1. Olá Marcos. Do modo que foi feito se não tratado, sim pode ocorrer SQL Injection.
      Quando criei o artigo não me preocupei com isso. Mais o correto é utilizar o Parameters.AddWithValue.

  25. olá rafael.

    amigo estou precisando de ajuda.
    tenho deficiência visual e estou tentando acompanhar seu tutorial.
    fico muito perdido, pois em vários momentos você se refere a figura para demonstrar o comando ou opção a ser escolhida.
    estou precisando muito aprender o conteúdo demonstrado.
    trabalho em um empresa com ti, o trabalho que tenho a desenvolver nesse momento esta dentro do que está mostrando.

    por favor, me ajuda.

    1. Olá Fabiano, tudo bem?
      Desculpe nossa falha. Iremos providenciar a revisão dos artigos.
      Esse seu relato é importante para nós até como critério de publicação e revisão dos artigos.
      Gostaria de contar sempre que possível com sua opinião para que possamos melhorar a qualidade de nossos artigos.

      Abraço
      Raphael Cardoso

  26. Rafhael não consigo postar nada no forun…!! Vê se me ajuda nessa ai, tenho um cadastro de clientes em Asp, usando formview e gridview, no form dei uma ajeitada, nos campos, usando tabela, depois disso, quando tento inserir algo da esse erro ai:
    var eventArgs = new Sys.WebForms.EndRequestEventArgs(error, data ? data.dataItems : {}, executor);
    Sys.Observer.raiseEvent(this, “endRequest”, eventArgs);
    if (error && !eventArgs.get_errorHandled()) {
    throw error;
    }

  27. Parabéns Raphael pelo seu artigo, sou novo na área de desenvolvimento e gostaria de saber se você teria mais artigos sobre asp.net e c#.
    Abraço,
    Leonardo

  28. Raphael bom dia
    Sei que esse canal não é o apropriado mas não achei outra forma de contato.
    Necessito de indicação de desenvolvedor de web site, em C-Sharp.
    A C-Sharp Br me agradou bastante, quer seja pela experiência de seus sócios quanto pelas publicações.
    Caso a C-Sharp Br não realize esse trabalho conto com sua ajuda para indicar empresa, de mesmo nipe, para esse trabalho.
    Grato pela atenção.
    Caggiano

  29. Olá! Sou iniciante em programação, estou tendo com erro dentro da classe Paginas da camada de WebSite.Businnes, na linha:

    public Entities.Paginas[] ListaPaginas(Entities.Paginas pagina)
    {… }

    esta dando erro no Lista Paginas: “WebSite.Businnes.Paginas.ListaPaginas(WebSite.Entities.Paginas): not all code paths return a value”

    Pode me ajudar?

    Obrigado!

  30. Meu sistema esta com erro dentro da classe Paginas da camada de WebSite.Businnes, na linha:

    public Entities.Paginas[] ListaPaginas()
    {
    return ListaPaginas(null);
    }

    public Entities.Paginas[] ListaPaginas(Entities.Paginas pagina)
    {
    List lstPaginas = new List();

    Data.Connection connection = new Data.Connection(this.ConnectionString);
    connection.AbrirConexao();
    sendo que paginas e data esta dando erro, pode me ajudar?

  31. Faltou uma referencia, quando baixei o seu, ai que vi. estou na aula 3, agora esta com erro no banco. Até perguntei para meu professor de ADO.net.
    Estou com um duvida, ao debugar meu sistema apareceu esse erro “Erro de rede ou específico à instância ao estabelecer conexão com o SQL Server. O servidor não foi encontrado ou não estava acessível. Verifique se o nome da instância está correto e se o SQL Server está configurado para permitir conexões remotas. (provider: Provedor de Pipes Nomeados, error: 40 – Não foi possível abrir uma conexão com o SQL Server)” .
    Será que tenho que executar o SQL SERVE SQLEXPRESS? so que ele não esta ativando.
    Ja pensei que ser erro na linha.

    public void AbrirConexao()
    {
    if (string.IsNullOrEmpty(this.ConnectionString)) throw new Exception(“Não foi informado a ConnectionString.”);

    if (Conexao == null)
    {
    Conexao = new SqlConnection();
    Conexao.ConnectionString = this.ConnectionString;

    }

    Conexao.Open();
    }
    Será que esqueci alguma coisa?

  32. boa tarde, Obrigada pela atenção
    Fiz a alteração, ficou assim
    public void AbrirConexao()
    {
    if (string.IsNullOrEmpty(this.ConnectionString)) throw new Exception(“Data Source=NATALIAPEREIRAMSSQLSERVER01;Initial Catalog=projeto_website;Persist Security Info=True;User ID=sa;Password=123456”);
    if (Conexao == null)
    {
    Conexao = new SqlConnection();
    Conexao.ConnectionString = this.ConnectionString;

    So que esta dando outros erros, não estou acostumada com Visual Studio. agora está com esse erros abaixo. parece algum conflito.
    Error 1 Unrecognized escape sequence C:UsersNatalia PereiraDesktopProjetoWebSite_parte2WebSite.DataConnection.cs 32 110 WebSite.Data
    Error 2 Could not get dependencies for project reference ‘WebSite.Data’ C:…WebSite
    Error 3 O namespace ‘WebSite’ em ‘c:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filesroot443971f61b03807dassemblydl37c00174a50f226d8_15d4cf01WebSite.Business.DLL’ está em conflito com o tipo ‘WebSite’ em ‘c:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filesroot443971f61b03807dApp_Code.0hawkdud.dll’ C:UsersNatalia PereiraDesktopProjetoWebSite_parte2WebSiteMenuControl.ascx.cs 13 9 C:…WebSite
    Error 4 O namespace ‘WebSite’ em ‘c:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filesroot443971f61b03807dassemblydl37c00174a50f226d8_15d4cf01WebSite.Business.DLL’ está em conflito com o tipo ‘WebSite’ em ‘c:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filesroot443971f61b03807dApp_Code.0hawkdud.dll’ C:UsersNatalia PereiraDesktopProjetoWebSite_parte2WebSiteMenuControl.ascx.cs 13 50 C:…WebSite
    Error 5 O namespace ‘WebSite’ em ‘c:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filesroot443971f61b03807dassemblydl37c00174a50f226d8_15d4cf01WebSite.Business.DLL’ está em conflito com o tipo ‘WebSite’ em ‘c:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filesroot443971f61b03807dApp_Code.0hawkdud.dll’ C:UsersNatalia PereiraDesktopProjetoWebSite_parte2WebSiteMenuControl.ascx.cs 15 9 C:…WebSite

  33. Boa tarde Raphael, fiz a alteração como vc falou, minha ConnectionString está com o nome de DBConnection e no web.cofig está
    ———————————————————

    ———————————————————
    mesmo assim esta dando um erro
    An exception of type ‘System.Data.SqlClient.SqlException’ occurred in System.Data.dll but was not handled in user code

    Additional information: Erro de rede ou específico à instância ao estabelecer conexão com o SQL Server. O servidor não foi encontrado ou não estava acessível. Verifique se o nome da instância está correto e se o SQL Server está configurado para permitir conexões remotas. (provider: Provedor de Pipes Nomeados, error: 40 – Não foi possível abrir uma conexão com o SQL Server).
    ————————————————
    o banco esta conectado, fiz algo errado? muito obrigada pela atenção e ajuda.

    1. Natalia, como esta seu config?
      O erro já diz tudo: Erro de rede ou específico à instância ao estabelecer conexão com o SQL Server. O servidor não foi encontrado ou não estava acessível.
      Seu servidor pode estar desligado, ou esta inacessível ou até mesmo não tem permissão de conexão remota pela aplicação.

  34. Acho que esta faltando alguma referencia.

    add name=”DBConnection” connectionString=”Data Source=192.168.3.000DBCONNECTION01;User Id=sa;Password=123456;Initial Catalog=projeto_website;” providerName=”System.Data.SqlClient”

    1. Natalia, o erro que esta ocorrendo de conexão, não é por conta de alguma referencia, mais sim pelo fato de o Data Source informado não existir. Verifique se o IP ou hostname que está informando realmente existe. É isso que o erro informa. O erro que informou: Erro de rede ou específico à instância ao estabelecer conexão com o SQL Server. O servidor não foi encontrado ou não estava acessível.
      Agora se o erro for diferente disso, me informe.

  35. Boa tarde Raplael, Como faço para colocar login na pagina inicial? eu queria colocar ele na pagina inicial e o usuário ter acesso na pagina serviços, contatos ..

    1. Natalia, veja a parte 4 do artigo, é semelhante ao citado no painel de controle. É só seguir a mesma ideia. Colocar os campos desejado, autenticar e redirecionar. Lembrando de tratar as permissões de visualização e acesso.

  36. Muito obrigada, você esta me ajudando muito.
    Apareceu esse erro ao copilar.

    Warning 1 Unable to update auto-refresh reference ‘ckeditor.net.dll’. Cannot find assembly ‘C:Program Files (x86)Microsoft ASP.NETCKEditor.NETCKEditor.NET.dll’. C:UsersNataliaDesktopsite02WebSiteBinckeditor.net.dll.refresh WebSite

    1. Olá Natália, esse problema não irá comprometer o funcionamento. Porem, esse arquivo o C:UsersNataliaDesktopsite02WebSiteBinckeditor.net.dll.refresh é o arquivo que contem o caminho do diretório do CKEditor. Faz o seguinte, crie o diretorio CKEditor.NET dentro da pasta C:Program Files (x86)Microsoft ASP.NET e coloque a arquivo CKEditor.NET.dll pois esse arquivo refresh é usado pelo Visual Studio para atualizar a DLL do projeto caso tenha atualizações.
      Se não quiser, não precisa fazer nada também. Esse Warning não irá comprometer o funcionamento do seu projeto.

  37. ok, vou fazer isso, muito obrigada, não estou acostumada com os erros do asp.net.
    em gerenciar usuário esta dando um erro também.
    O erro fal que e no asp.

    Warning 1 Unrecognized tag prefix or device filter ‘asp’. C:UsersNataliaDocumentsVisual Studio 2013ProjectsProjetoWebSite_parte5WebSitepainelgerenciar_usuario.aspx 6 6 WebSite
    Warning 2 Unrecognized tag prefix or device filter ‘asp’. C:UsersNataliaDocumentsVisual Studio 2013ProjectsProjetoWebSite_parte5WebSitepainelgerenciar_usuario.aspx 9 6 WebSite
    Warning 3 Validation (XHTML 1.0 Transitional): Element ‘alternatingrowstyle’ is not supported. C:UsersNataliaDocumentsVisual Studio 2013ProjectsProjetoWebSite_parte5WebSitepainelgerenciar_usuario.aspx 14 10 WebSite
    Warning 4 Validation (XHTML 1.0 Transitional): Element ‘columns’ is not supported. C:UsersNataliaDocumentsVisual Studio 2013ProjectsProjetoWebSite_parte5WebSitepainelgerenciar_usuario.aspx 15 10 WebSite
    Warning 5 Unrecognized namespace ‘asp’. C:UsersNataliaDocumentsVisual Studio 2013ProjectsProjetoWebSite_parte5WebSitepainelgerenciar_usuario.aspx 16 14 WebSite
    Warning 6 Unrecognized namespace ‘asp’. C:UsersNataliaDocumentsVisual Studio 2013ProjectsProjetoWebSite_parte5WebSitepainelgerenciar_usuario.aspx 18 14 WebSite
    Warning 7 Validation (XHTML 1.0 Transitional): Element ‘itemtemplate’ is not supported. C:UsersNataliaDocumentsVisual Studio 2013ProjectsProjetoWebSite_parte5WebSitepainelgerenciar_usuario.aspx 19 18 WebSite

  38. Bom dia Raphael
    Ao debug a aplicação ocorre um erro na conexão do banco
    Na classe Connection
    if (Conexao == null || Conexao.State == ConnectionState.Closed)…

    O que devo fazer para tratar?acho que falta algo na classe usuário.

    An exception of type ‘System.Exception’ occurred in WebSite.Data.DLL but was not handled in user code

    Additional information: Não foi informado a query SQL.

  39. Bom dia, sou nova no asp.net e não sei onde informo a query sql, já pesquisei e não encontre, vc poderia me falar?
    Obrigada pela ajuda.

  40. no na classa Connection na linha que ele apontou
    if (Conexao == null || Conexao.State == ConnectionState.Closed) throw new Exception(“A conexão fechada. Execute o comando AbrirConexao e não se esqueça de FecharConexao no final.”);

    Obrigada pela ajuda.

  41. Comigo não está rolando…

    Segue o erro…

    Erro de Servidor no Aplicativo ‘/WebSite’.

    Erro de Compilação

    Descrição: Erro ao compilar um recurso necessário para atender esta solicitação. Examine os detalhes específicos do erro e modifique o código fonte apropriadamente.

    Mensagem de Erro do Compilador: CS0246: O nome de namespace ou o tipo ‘WebSite’ não pôde ser encontrado. Precisa de uma diretiva using ou de uma referência de assembly?

    Erro de Origem:

    Linha 13: {
    Linha 14: // Instancia da classe de Negocio
    Linha 15: WebSite.Business.Paginas paginasBO = new WebSite.Business.Paginas();
    Linha 16: // Chamada ao metodo que lista todas as paginas que irá gerar um array das mesmas
    Linha 17: WebSite.Entities.Paginas[] paginas = paginasBO.ListaPaginas();

    Arquivo de Origem: c:\inetpub\wwwroot\Estudos\ASP.NET\WebSite\MenuControl.ascx.cs Linha: 15

    1. Marcelo, não foi encontrado namespace WebSite. Verifique no Visual Studio se existe alguma dll faltando. Provavelmente está faltando a dll refente a camada de BO ou alguma dll dentro dessa camada.

Os comentários estão fechados.