Desenvolvimento de Website com ASP.NET e SQL Server - Parte 1 - C# Brasil


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

{lang: 'pt-BR'}

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.

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 && 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) && pagina.Titulo.Length > 0)
                {
                    sqlString.AppendLine("and titulo_pagina like '" + pagina.Titulo.Replace("'", "''") + "'");
                }

                if (!string.IsNullOrEmpty(pagina.Texto) && 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 && 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!

Postado em ASP.NET, C#, SQL Server, Visual Studio | Marcado como , , , , , , , , , , , , , , , ,

48 respostas para “Desenvolvimento de Website com ASP.NET e SQL Server – Parte 1”

  1. Leando Teixeira disse:

    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. Olá Leandro
    Obrigado por acompanhar o C# Brasil.
    O Erro que está dando é de referencia?

    Realmente eu não citei que deveria adicionar como referencia o System.Configuration.

  3. Leando Teixeira disse:

    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.

  4. Você adicionou a dll da camada de conexão?

  5. Leando Teixeira disse:

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

  6. LucasHenrique disse:

    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.

  7. Adicione a referência ao projeto. Chama-se System.Configuration e em seguida o using deverá ser informado na página que for usada.

  8. rochasdv disse:

    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″;

  9. Utilizando o método ExecuteReader da camada de conexão. Pense que ao invés de fazer um website você está fazendo um form, o método será idêntico.

  10. Fabiano disse:

    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?

  11. O que você poderia fazer como eu, criar uma procedure para gerar as classes.

  12. Fabio disse:

    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

  13. Fabio disse:

    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….

  14. fabianocruzdf disse:

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

  15. 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 '}'

  16. fabianocruzdf disse:

    WOW!
    Muito bom mano! Show de bola! Vlw!!!

  17. Eu fiz a versão dessa procedure para mysql, quem se interessar…

  18. Luiz disse:

    Opa, se tiver como mandar a do MySql, pra mim vai ser otimo!

  19. 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, '\r\n');
    SET CODIGO := CONCAT(CODIGO, '{', '\r\n');

    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, '")]', '\r\n');*/
    SET CODIGO := CONCAT(CODIGO, ' public ', TIPO, ' ', NOME, ' {get; set; } ', '\r\n');

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

    END LOOP;

    CLOSE CUR_GERA_CLASSE;

    SET CODIGO := CONCAT(CODIGO, '', '\r\n');
    SET CODIGO := CONCAT(CODIGO, ' public ', TABELA, '()', '\r\n');
    SET CODIGO := CONCAT(CODIGO, ' {', '\r\n');
    SET CODIGO := CONCAT(CODIGO, '', '\r\n');
    SET CODIGO := CONCAT(CODIGO, ' }', '\r\n');

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

    SET CODIGO := CONCAT(CODIGO, '}', '\r\n');

    RETURN CODIGO;

    END
    // DELIMITER ;

  20. barros.11 disse:

    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

  21. 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.

  22. João Leles disse:

    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.

  23. Você incluir no projeto a referencia WebSite.Data? Qual erro ocorre?

  24. João Leles disse:

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

  25. Maravilha! Precisando estamos aqui para ajudar!

    Abraço e sucesso!

  26. juniorleles disse:

    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”.

  27. Você já verificou se existe a connection string no web.config?

  28. Douglas Almeida disse:

    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!

  29. juniorleles disse:

    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.

  30. Luiz disse:

    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?

  31. 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

  32. Marcos Batista disse:

    Porque você não utilizou Linq To Sql. Seria mais interessante!!!!

  33. Ola Marcos, tudo bem? Realmente seria mais interessante, mais a idéia é realmente essa, ensinar o modo mais difícil.

  34. Cris disse:

    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

  35. Nesse caso você deverá adicionar pelo menu File > Add > New Project

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

  37. Osvaldo M Costa disse:

    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.

  38. Livia disse:

    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?

  39. Waldir disse:

    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.

  40. Olá Waldir, não entendi sua dúvida. A dificuldade é incluir o Code Behind do menuControl ou acessa-lo?

  41. Waldir disse:

    Olá Raphael, é incluí-lo mesmo não tive sucesso coloquei um evento loand, mais não rodou.

  42. Michael disse:

    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.

  43. 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

  44. Marcos Lopes disse:

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

  45. 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.

  46. fabianobt.lima@hotmail.com disse:

    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.

  47. 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

  48. Luizjr disse:

    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;
    }

Deixe uma resposta

Qual a soma da expressão:
4 + 3