none
Manejo del data reader RRS feed

  • Pregunta

  • Hola programadores!!!

    Utilizando en dataReader en  Visual C# 2008 estoy haciendo una consulta y cuando me devuelve los datos los las puedo asignar a los atributos de una clase, muestro el código a continuación:

     

    try

    {

    strSQL =

    "SELECT * FROM Empresas";

    strSQL +=

    " WHERE Codigo = " + Empresa .Codigo;

     

    SqlCommand ComandoSQL = new SqlCommand(strSQL , objConexion.ConexionSQL);

    objConexion .ConexionSQL .Open();

     

    SqlDataReader sdrCataEmpresa = ComandoSQL.ExecuteReader();

     

    if (sdrCataEmpresa.Read())

    {

    Empresa.Nombre =

    Convert.ToString(sdrCataEmpresa["Nombre"]);

    Empresa.Direccion =

    Convert.ToString(sdrCataEmpresa["Direccion"]);

    Empresa.Celular =

    Convert.ToString(sdrCataEmpresa["Celular"]);

    Empresa.Email =

    Convert.ToString(sdrCataEmpresa["Email"]);

    Empresa.WebSite =

    Convert.ToString(sdrCataEmpresa["Web_Site"]);

    Empresa.Nit =

    Convert.ToString(sdrCataEmpresa["Nit"]);

    Empresa.Regimen.Cargar(Empresa,

    Convert .ToInt32(sdrCataEmpresa["DECL_Regimen"]));

    Empresa.RepresentanteComercial.Cargar(Empresa,

    Convert .ToInt32(sdrCataEmpresa["USUA_Representante_Comercial"]));

    Empresa.Ciudad.Cargar (Empresa,

    Convert.ToInt32(sdrCataEmpresa["CIUD_Codigo"]));

    Empresa.Departamento.Cargar(Empresa,

    Convert .ToInt32 (sdrCataEmpresa["DEPA_Codigo"]));

     

    Empresa.NumeroEmpleados =

    Convert.ToInt32(sdrCataEmpresa["Numero_Empleados"]);

     

    return true;

    }


    POr que no puedo decirle a Empresa.Nombre el valor de Convert.ToString(sdrCataEmpresa["Nombre"]) ?????


    Gracias espero respuestas!!!!

    domingo, 20 de diciembre de 2009 23:03

Respuestas

  • hola

    -un consejo previo cuando pegues codigo el post no lo hagas directamente en desde el VS al post del foro ya que cuando publicas la pregunta se pierde la identacion del codigo, es preferible que el cosigoe ste identado a que tenga colores

    - otro consejo para armar una cadena de consulta puedes usar el @ y no tener que contactenar en dos lineas el string
    el @ permite ahacer string multilineas

    - y ademas siempre usa parametros en las consultas, a la larga veras que es mas practico


    strSQL = @"SELECT * FROM Empresas
                WHERE Codigo = @codigo";



    SqlCommand ComandoSQL = new SqlCommand(strSQL , objConexion.ConexionSQL);
    ComandoSQL.Parameters.AddWithValue("codigo", Empresa.Codigo);

    objConexion.ConexionSQL.Open();

    SqlDataReader sdrCataEmpresa = ComandoSQL.ExecuteReader();

     
    if (sdrCataEmpresa.Read())
    {
        Empresa.Nombre = Convert.ToString(sdrCataEmpresa["Nombre"]);

        Empresa.Direccion = Convert.ToString(sdrCataEmpresa["Direccion"]);

        Empresa.Celular = Convert.ToString(sdrCataEmpresa["Celular"]);

        Empresa.Email = Convert.ToString(sdrCataEmpresa["Email"]);

        Empresa.WebSite = Convert.ToString(sdrCataEmpresa["Web_Site"]);

        Empresa.Nit = Convert.ToString(sdrCataEmpresa["Nit"]);

        Empresa.Regimen.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["DECL_Regimen"]));

        Empresa.RepresentanteComercial.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["USUA_Representante_Comercial"]));

        Empresa.Ciudad.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["CIUD_Codigo"]));

        Empresa.Departamento.Cargar(Empresa, Convert .ToInt32 (sdrCataEmpresa["DEPA_Codigo"]));

        Empresa.NumeroEmpleados = Convert.ToInt32(sdrCataEmpresa["Numero_Empleados"]);

        return true;

    }


    bien con respecto al error la verdad no veo nada que indique que puede estar incorrecto


    - cuando dices que no puedes asignar el valor del reader a la propiedad, esta visualizando algun error en particular?
    este se produce en tiempo de diseño o ejecucion ?


    - algo que no estoy viendo es donde creas la instacia de la entidad Empresa ?
    o sea donde haces

    Empresa Empresa = new Empresa();

    o mejor dicho lo estas haciendo ?


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 20 de diciembre de 2009 23:19
  • hola


    la ventaja de usar parametros son varias

    - el codigo queda ams prolijo y legible especialmente cuando tienes consultas de mucho parametros

    - si vas hilando fino el concatenar string no es performante para el procedamiento, por ahi no lo notes con aplicaciones simples pero en lugares donde la performace es importante se trata de evitar concatenar cadenas largas, el uso de parametros justamente evita esto

    - en los parametros peude definir el tipo de dato cosa que en un string al contatenar se complica, especialmente con parametros no tan comunes como pueden ser un DataTime, o y byte[], imagina que quieres pasar un archivo a un campo del tipo binary a la db, como harias sin parametros
    por ahi con el metodo AddWithValue no lo notas pero este esta infiriendo el tipo de dato del parametro segun el tipo de dato que usas

    no es lo mismo

    ComandoSQL.Parameters.AddWithValue("codigo", Convert.ToInt32(Empresa.Codigo));

    que

    ComandoSQL.Parameters.AddWithValue("codigo", Convert.ToString(Empresa.Codigo));

    ojo proque estas indicando dos tipos de datos distintos, si el campo de la tabla es INT debes usar la primer linea
    si la propiedad Codigo es del tipo int no ahce falta convertirla, aqui es solo un ejemplo para reflejar la diferencia


    - si estarias en un ambiente web este evita un taque clasico de los hackers que es el sql injection

    como veras es muy recomendable los parametros


    la verdad yo no uso el @ en el nombre ya que lo toma igual
    es ams creo que si lo escribes @codigo o codigo es lo mismo funciona con ambos


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 24 de diciembre de 2009 1:07
  • Q pena responder esto hasta ahora,

     

    El problema esta en que esta parte del código: intCodigo = Codigo;

    No es así sino: intCodigo = Value;

    Q bobada, bueno eso era todo, chauuu

     


    martes, 25 de mayo de 2010 3:09

Todas las respuestas

  • hola

    -un consejo previo cuando pegues codigo el post no lo hagas directamente en desde el VS al post del foro ya que cuando publicas la pregunta se pierde la identacion del codigo, es preferible que el cosigoe ste identado a que tenga colores

    - otro consejo para armar una cadena de consulta puedes usar el @ y no tener que contactenar en dos lineas el string
    el @ permite ahacer string multilineas

    - y ademas siempre usa parametros en las consultas, a la larga veras que es mas practico


    strSQL = @"SELECT * FROM Empresas
                WHERE Codigo = @codigo";



    SqlCommand ComandoSQL = new SqlCommand(strSQL , objConexion.ConexionSQL);
    ComandoSQL.Parameters.AddWithValue("codigo", Empresa.Codigo);

    objConexion.ConexionSQL.Open();

    SqlDataReader sdrCataEmpresa = ComandoSQL.ExecuteReader();

     
    if (sdrCataEmpresa.Read())
    {
        Empresa.Nombre = Convert.ToString(sdrCataEmpresa["Nombre"]);

        Empresa.Direccion = Convert.ToString(sdrCataEmpresa["Direccion"]);

        Empresa.Celular = Convert.ToString(sdrCataEmpresa["Celular"]);

        Empresa.Email = Convert.ToString(sdrCataEmpresa["Email"]);

        Empresa.WebSite = Convert.ToString(sdrCataEmpresa["Web_Site"]);

        Empresa.Nit = Convert.ToString(sdrCataEmpresa["Nit"]);

        Empresa.Regimen.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["DECL_Regimen"]));

        Empresa.RepresentanteComercial.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["USUA_Representante_Comercial"]));

        Empresa.Ciudad.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["CIUD_Codigo"]));

        Empresa.Departamento.Cargar(Empresa, Convert .ToInt32 (sdrCataEmpresa["DEPA_Codigo"]));

        Empresa.NumeroEmpleados = Convert.ToInt32(sdrCataEmpresa["Numero_Empleados"]);

        return true;

    }


    bien con respecto al error la verdad no veo nada que indique que puede estar incorrecto


    - cuando dices que no puedes asignar el valor del reader a la propiedad, esta visualizando algun error en particular?
    este se produce en tiempo de diseño o ejecucion ?


    - algo que no estoy viendo es donde creas la instacia de la entidad Empresa ?
    o sea donde haces

    Empresa Empresa = new Empresa();

    o mejor dicho lo estas haciendo ?


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 20 de diciembre de 2009 23:19
  • hola

    te sirvio la respuesta para solucionar el problema ?

    pudiste analizar el código que deje el el post anterior ?

    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 23 de diciembre de 2009 0:50
  • Hola Leandro

    Que pena por responder tan tarde, al parecer me llegan las alertas al correo electronico cuando van dos respuestas.

    1. Continuando con esta duda, la verdad no estoy instanciando la empresa puesto que por error pensé que no lo necesitaba hacer ya que mandaba un objeto empresa y que este me servía durante todo el tiempo en el cúal la función era ejecutada; por lo cual, creo que el error está en no instanciar ello.

    2. Ahora no estaba mandando error el dataReader puesto que si devolvía los datos de la consulta.

    3. Me pareció bastente interesante el hecho de armar consultas con el "@" eso si que es muy muy novedoso.

    4. En el caso de cuando se parametriza la consulta, no conocía ese método, pero sería bueno conocer las ventajas de saber por que es mucho mejor así que mandando un atributo de un objeto. Ahora una pregunta, en el caso de: ComandoSQL.Parameters.AddWithValue("codigo", Empresa.Codigo);, no tengo luego que mandar el @codigo en vez de codigo????.


    Gracias de nuevo por tu ayuda.
    miércoles, 23 de diciembre de 2009 23:58
  • hola


    la ventaja de usar parametros son varias

    - el codigo queda ams prolijo y legible especialmente cuando tienes consultas de mucho parametros

    - si vas hilando fino el concatenar string no es performante para el procedamiento, por ahi no lo notes con aplicaciones simples pero en lugares donde la performace es importante se trata de evitar concatenar cadenas largas, el uso de parametros justamente evita esto

    - en los parametros peude definir el tipo de dato cosa que en un string al contatenar se complica, especialmente con parametros no tan comunes como pueden ser un DataTime, o y byte[], imagina que quieres pasar un archivo a un campo del tipo binary a la db, como harias sin parametros
    por ahi con el metodo AddWithValue no lo notas pero este esta infiriendo el tipo de dato del parametro segun el tipo de dato que usas

    no es lo mismo

    ComandoSQL.Parameters.AddWithValue("codigo", Convert.ToInt32(Empresa.Codigo));

    que

    ComandoSQL.Parameters.AddWithValue("codigo", Convert.ToString(Empresa.Codigo));

    ojo proque estas indicando dos tipos de datos distintos, si el campo de la tabla es INT debes usar la primer linea
    si la propiedad Codigo es del tipo int no ahce falta convertirla, aqui es solo un ejemplo para reflejar la diferencia


    - si estarias en un ambiente web este evita un taque clasico de los hackers que es el sql injection

    como veras es muy recomendable los parametros


    la verdad yo no uso el @ en el nombre ya que lo toma igual
    es ams creo que si lo escribes @codigo o codigo es lo mismo funciona con ambos


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 24 de diciembre de 2009 1:07
  • Hola


    Que buena aclaración esto si es muy útil ya que para donde laboro, las consultas que se tienen que hacer aveces son muy grandes. De verdad muchas gracias por tus aclaraciones, me fueron muy utiles.


    Saludos.

    sábado, 26 de diciembre de 2009 17:08
  • Hola Leandro


    Continuando con el método que deseo implementar, el problema persiste y ya instancié un objeto Empresa de la clase empresa dentro de la función:

    public Boolean Cargar(clsEmpresa Empresa)
            {
                clsPersisConexion objConexion = new clsPersisConexion();
                clsEmpresa objEmpresa = new clsEmpresa();

                objEmpresa = Empresa;

                try
                {
                    strSQL = @"SELECT * FROM Empresas
                                WHERE Codigo = @codigo";

                    SqlCommand ComandoSQL = new SqlCommand(strSQL, objConexion.ConexionSQL);
                    ComandoSQL.Parameters.AddWithValue("codigo", objEmpresa.Codigo);

                    objConexion.ConexionSQL.Open();

                    SqlDataReader sdrCataEmpresa = ComandoSQL.ExecuteReader();

                    if (sdrCataEmpresa.Read())
                    {
                        objEmpresa.Nombre = Convert.ToString(sdrCataEmpresa["Nombre"]);
                        objEmpresa.Direccion = Convert.ToString(sdrCataEmpresa["Direccion"]);
                        objEmpresa.Celular = Convert.ToString(sdrCataEmpresa["Celular"]);
                        objEmpresa.Email = Convert.ToString(sdrCataEmpresa["Email"]);
                        objEmpresa.WebSite = Convert.ToString(sdrCataEmpresa["Web_Site"]);

                        objEmpresa.Nit = Convert.ToString(sdrCataEmpresa["Nit"]);
                        objEmpresa.Regimen.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["DECL_Regimen"]));
                        objEmpresa.RepresentanteComercial.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["USUA_Representante_Comercial"]));
                        objEmpresa.Ciudad.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["CIUD_Codigo"]));
                        objEmpresa.Departamento.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["DEPA_Codigo"]));

                        objEmpresa.NumeroEmpleados = Convert.ToInt32(sdrCataEmpresa["Numero_Empleados"]);

                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                catch (Exception ex)
                {
                    return false;
                    strError = ex.Message;
                }
            }

    El problema está en que el dataReader se llena, pero al momento de pasar la información al atributo de la clase, este queda vacio, porque??????

    lunes, 28 de diciembre de 2009 19:09
  • hola

    esto sucede porque es bastante raro como haces para devolver la entidad
    o sea porque devuelves un boolen, devuelve directo al entidad, y si quieres saber si carogo o no controla si esta esta en null o si tiene una instancia


    public clsEmpresa Cargar(int Codigo)
            {
                clsPersisConexion objConexion = new clsPersisConexion();

                clsEmpresa objEmpresa = null;

                try
                {
                    strSQL = @"SELECT * FROM Empresas
                                WHERE Codigo = @codigo";

                    SqlCommand ComandoSQL = new SqlCommand(strSQL, objConexion.ConexionSQL);
                    ComandoSQL.Parameters.AddWithValue("codigo", Codigo);

                    objConexion.ConexionSQL.Open();

                    SqlDataReader sdrCataEmpresa = ComandoSQL.ExecuteReader();

                    if (sdrCataEmpresa.Read())
                    {

                        objEmpresa =  new clsEmpresa();

                        objEmpresa.Nombre = Convert.ToString(sdrCataEmpresa["Nombre"]);
                        objEmpresa.Direccion = Convert.ToString(sdrCataEmpresa["Direccion"]);
                        objEmpresa.Celular = Convert.ToString(sdrCataEmpresa["Celular"]);
                        objEmpresa.Email = Convert.ToString(sdrCataEmpresa["Email"]);
                        objEmpresa.WebSite = Convert.ToString(sdrCataEmpresa["Web_Site"]);

                        objEmpresa.Nit = Convert.ToString(sdrCataEmpresa["Nit"]);
                        objEmpresa.Regimen.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["DECL_Regimen"]));
                        objEmpresa.RepresentanteComercial.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["USUA_Representante_Comercial"]));
                        objEmpresa.Ciudad.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["CIUD_Codigo"]));
                        objEmpresa.Departamento.Cargar(Empresa, Convert.ToInt32(sdrCataEmpresa["DEPA_Codigo"]));

                        objEmpresa.NumeroEmpleados = Convert.ToInt32(sdrCataEmpresa["Numero_Empleados"]);

                       
                    }

                    return objEmpresa ;
                   
                }
                catch (Exception ex)
                {
                    return null;
                    strError = ex.Message;
                }
            }
     

    luego para usarlo haces

    clsEmpresa objEmpresa = this.Cargar(10);

    if(objEmpresa == null){
      MessageBox.Show("no se encontro la empresa");
      return;
    }

    // aqui cargas los datos en los controles ya que tienes la entidad empresa cargada


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 28 de diciembre de 2009 21:42
  • Hola


    Este semestre estuve programando en JAVA por obligación, resulta que de la forma en que yo estoy haciendo mis funciones me funcionaban en JAVA correctamente y lograba asignar los resultados que obtenia de bases de datos. Ahora me doy cuenta que esto no es posible en C#.Net. Yo en JAVA tenía la siguiente estructura de un programa de acuerdo a UML:

    1. Las Clases en un paquete.
    2. Mis catalogos en otro oaquete.
    3. Conexión a base de datos en otro paquete.

    Cuando quería cargar un objeto de cualquier clase lo hacia con la estructura de que tenia: mi clase y el catalogo correspondiente a la clase que establecía toda la parte de acceso a datos.

    Ahora yo en mi clase llamaba a la función que estaba mi catalogo, el catalogo me cargaba un objeto y ese objeto de cargaba mi clase ya que mandaba mi clase, es decir "this". Ahora así mantenía toda la estructura y se me cargaba los atributos de mi clase como lo estoy deseando hacer en mi función.

    Intenté de la manera que me sugeriste y no me resultó, no se por que no se carga el objeto; pero si implemento esta función en la clase, esta si se carga y la verdad no se porque.

    Sería bueno porque esta función funciona a la perfección dentro de la clase y no cuando deseo cargar un objeto.

    Habría alguna clase de inconveniente con los metodos get y set de mi clase??

    Así tengo esos métodos, por ejemplo:

            public int Codigo
            {
                get
                {
                    return intCodigo;
                }
                set
                {
                    intCodigo = Codigo;
                }
            }

    Saludos,

     

    miércoles, 30 de diciembre de 2009 16:59
  • Q pena responder esto hasta ahora,

     

    El problema esta en que esta parte del código: intCodigo = Codigo;

    No es así sino: intCodigo = Value;

    Q bobada, bueno eso era todo, chauuu

     


    martes, 25 de mayo de 2010 3:09