none
Classes e Stored Procedures RRS feed

  • Pergunta

  • PESSOAL,

    TENHO UMA CLASSE PROFESSORES QUE VAI NUM BANCO DE DADOS E EXECUTA UMA STORED
    PROCEDURE (A), TRAZENDO OS CAMPOS idProfessor, professorEspecialidade, professorNome,
    professorSobrenome, professorFoto e professorDescricao. Ou seja, trazendo TODOS
    os campos disponiveis.

    Entao essa classe funcionara normalmente quando eu realizar a parte do reader logo
    abaixo.

    No entanto vamos supor que eu queira executar uma outra procedure (B), e esta ao
    inves de trazer TODOS os campos, ira trazer somente idProfessor e professorNome.

    Qdo eu realizar a atribuicao atraves do reader abaixo, isso vai gerar um erro.
    Isso pq so virao 2 campos do banco de dados e ele tentara executar o reader para
    os demais campos (que nao estarao vindo).

    Mas como faco pra utilizar essa mesma classe se em determinado momento eu so precisar
    desses 2 campos ? Terei ue criar uma nova classe so pra este fim ?
    Ou terei qeu trazer do banco todos os campos mesmo que eu nao use ?

    Valeu pela ajuda,

    -------------------------------

    namespace meuSite { public class Professores #region Area get/set { private int _idProfessor; private string _professorEspecialidade; private string _professorNome; private string _professorSobrenome; private string _professorFoto; private string _professorDescricao; public int idProfessor { get { return _idProfessor; } set { _idProfessor = value; } } public string professorEspecialidade { get { return _professorEspecialidade; } set { _professorEspecialidade = value; } } public string professorNome { get { return _professorNome; } set { _professorNome = value; } } public string professorSobrenome { get { return _professorSobrenome; } set { _professorSobrenome = value; } } public string professorDescricao { get { return _professorDescricao; } set { _professorDescricao = value; } } public string professorFoto { get { return _professorFoto; } set { _professorFoto = value; } } #endregion #region Methods public static List<Professores> SelectProfessores() { SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("SelectAllProfessores", con); cmd.CommandType = CommandType.StoredProcedure; List<Professores> results = new List<Professores>(); using (con) { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { results.Add(new Professores(reader)); } con.Close(); return results; } } #endregion

    //////////////////////////////////////////////////////
    //AQUI QUE PRECISO DE AJUDA

    public Professores(SqlDataReader reader) { _idProfessor = (int)reader["id_professor"]; _professorEspecialidade = (string)reader["professor_especialidade"]; _professorNome = (string)reader["professor_nome"]; _professorSobrenome = (string)reader["professor_sobrenome"]; _professorDescricao = (string)reader["professor_descricao"]; _professorFoto = (string)reader["professor_foto"]; } static Professores() { _connectionString = WebConfigurationManager.ConnectionStrings["minhaStr"].ConnectionString; } } }

    terça-feira, 21 de maio de 2013 05:21

Todas as Respostas

  • Neto,

    Eu costumo validar usando de um extension method que verifica se a coluna existe no resultado do DataReader:

    using System;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace ConsoleApplication3
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                Parceiro objParceiro = new Parceiro();
                using (SqlConnection conn = new SqlConnection("CONEXAO"))
                using (SqlCommand cmd = new SqlCommand("SELECT Id  FROM PARCEIRO", conn))
                {
                    conn.Open();
    
                    SqlDataReader dr = cmd.ExecuteReader();
    
                    while (dr.Read())
                    {
                        if (dr.HasColumn("Id") && !dr.IsDBNull(dr.GetOrdinal("Id")))
                            objParceiro.Id = dr.GetInt32(dr.GetOrdinal("Id"));
    
                        if (dr.HasColumn("Nome") && !dr.IsDBNull(dr.GetOrdinal("Nome")))
                            objParceiro.Nome = dr.GetString(dr.GetOrdinal("Nome")).Trim();
                    }
                }
            }        
        }
    
        public static class Extensions
        {
            public static bool HasColumn(this IDataRecord r, string columnName)
            {
                try
                {
                    return r.GetOrdinal(columnName) >= 0;
                }
                catch (IndexOutOfRangeException)
                {
                    return false;
                }
            }
        }
    
        public class Parceiro
        {
            public int Id { get; set; }
    
            public string Nome { get; set; }
        }
    }
    


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    terça-feira, 21 de maio de 2013 14:16
  • Entendido.
    Mas uma coisa que nao entendi foi o GetOrdinal
    sexta-feira, 31 de maio de 2013 21:09
  • Neto,

    ele pega exatamente a posição de uma coluna no DataReader, para validar se o mesmo é nulo ou não, exemplo:

    SELECT Id, Nome  FROM PARCEIRO

    Usando do GetOrdinal() na coluna Nome, ele me retorna o indice "1", eu valido se o valor contido naquela interação na coluna "Nome" não é nulo, saco ?

    :D

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    sexta-feira, 31 de maio de 2013 21:11