none
Busqueda dentro de un Data Reader RRS feed

  • Pregunta

  • Hola, estoy buscando la forma de entrar a una base de datos, mi código es el siguiente

    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DB_planning_tool_SQLConnectionString"].ConnectionString);
            con.Open();
    
            SqlCommand cmd = new SqlCommand("select * from registros;", con);
            using (SqlDataReader sdr = cmd.ExecuteReader()) {
                
                while (sdr.Read())
                {
                   
                    HtmlTableRow tr = heijunka.FindControl("tr11") as HtmlTableRow;
                    HtmlTableCell td = tr.FindControl("td112") as HtmlTableCell;
                    string dato = sdr.GetValue(0).ToString();
                    td.InnerText =  dato
    con.Close();
    Lo que me arroja éste código, es el primer valor que encuentra dentro de la tabla, como le hago para que me muestre todos, o por lo menos el siguiente dato

    Gracias de antemano

    miércoles, 27 de julio de 2016 14:57

Respuestas

  • JlarzateC,

    Te basta con realizar la condición en cada ciclo del objeto de tipo DataReader.

    while (sdr.Read())
    {
       
    	if (dr.GetString(0) == valor)
            {
                    string dato = sdr.GetString(0);
            }
    }


    Sin embargo, ¿no has evaluado la posibilidad de realizar la condición en la consulta sql para recuperar sólo la fila que requieres?

    SqlCommand cmd = new SqlCommand("SELECT Campo1 FROM SomeTable WHERE (id = @id), con);
    
    cmd.Parameters.AddWithValue("@id", valor);
    
    string dato = cmd.ExecuteScalar();
    


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    miércoles, 27 de julio de 2016 17:00
  • listo facil con el codigo que te di devuelve un datatable 

     DbConnection conn = new DbConnection(Globals.DbConnection);
                        DataTable tableUser = new DataTable();
                        string strUser = conn.querySearchSqlUSer(column, target);
                        //consultar Tabla SQL
    
                        SqlCommand userComm = conn.CreateCommand(strUser);
                       
     tableUser = conn.SqlQuery(userComm);
                       
                        conn.CloseConn();

    despues pasas de datatable a html table con esta funcion 

    public static string ConvertDataTableToHTML(DataTable dt)
        {
            string html = "<table>";
            //add header row
            html += "<tr>";
            for(int i=0;i<dt.Columns.Count;i++)
                html+="<td>"+dt.Columns[i].ColumnName+"</td>";
            html += "</tr>";
            //add rows
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                html += "<tr>";
                for (int j = 0; j< dt.Columns.Count; j++)
                    html += "<td>" + dt.Rows[i][j].ToString() + "</td>";
                html += "</tr>";
            }
            html += "</table>";
            return html;
        }

    Espero te sirva 

    • Marcado como respuesta JlarzateC lunes, 8 de agosto de 2016 16:20
    jueves, 28 de julio de 2016 13:08

Todas las respuestas

  • JlarzateC,

    El objeto [sdr] se carga de filas tras la ejecución del comando (ExecuteReader), la instrucción while itera por todas las filas recuperadas sin embargo tu tomas el valor en una variable quedando claro que terminado el bucle obtendrás el valor de la última fila leída. Si quieres obtener todas las filas en una estructura puedes hacer uso de una lista de un tipo que defina los campos que deseas obtener, o puedes volcar los datos a un objeto de tipo DataTable y luego puedes recorrer las filas del objeto.

    Nota además -quizá fue un error en la transcripción del código- que cierras la conexión dentro del bloque while(), ¿es así como tienes el código? si es así debes colocar el método Close() luego de cerrar el bloque while.

    while (sdr.Read())
    {
            <...>
    }    
    con.Close();

    miércoles, 27 de julio de 2016 15:15
  • hola

    al ir creando las rows deberias ir agregandolas a una coleccion dentro del while

    while (sdr.Read())
    {
       
    	HtmlTableRow tr = heijunka.FindControl("tr11") as HtmlTableRow;
    	HtmlTableCell td = tr.FindControl("td112") as HtmlTableCell;
    	string dato = sdr.GetValue(0).ToString();
    	td.InnerText =  dato
    	
    	tabla.Add(tr);
    }

    tienes que agregar la row en la tabla

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 27 de julio de 2016 15:27
  • Hola, gracias por tu respuesta, si me sirve poder haacer una lista pero no necesito mostrarla en una estructura, por ejemplo "GridView" si no que poder de una columna acceder a todos los datos (filas) y poder sacar uno por uno, pero haciendo un if para que de 50 datos, saque uno que coincida para desplegarlo en una tabla html

    Supongo que esto se tiene que hacer en un for y ya despues el if

    nota: fue un error de dedo el cerrar el metodo while

    miércoles, 27 de julio de 2016 16:43
  • JlarzateC,

    Te basta con realizar la condición en cada ciclo del objeto de tipo DataReader.

    while (sdr.Read())
    {
       
    	if (dr.GetString(0) == valor)
            {
                    string dato = sdr.GetString(0);
            }
    }


    Sin embargo, ¿no has evaluado la posibilidad de realizar la condición en la consulta sql para recuperar sólo la fila que requieres?

    SqlCommand cmd = new SqlCommand("SELECT Campo1 FROM SomeTable WHERE (id = @id), con);
    
    cmd.Parameters.AddWithValue("@id", valor);
    
    string dato = cmd.ExecuteScalar();
    


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    miércoles, 27 de julio de 2016 17:00
  • hola

    o sea estas desarrollando la capa de persistencia ?

    [ASP.NET] GridView – Edición Empleados

    descarga el ejemplo y analiza como se hace uso del reader en la capa de persistencia

    alli veras como se carga la entidad

    depues puedes usar linq para solo 50 con el Take() o recuperar alguno usando el where

    Getting Started with LINQ in C#

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 27 de julio de 2016 17:30
  • Probando el primer ejemplo, en el if al poner =="valor1" que corresponde al primer valor de mi tabla si lo muestra, pero al poner =="valor2" no muestra nada y es el siguiente valor de mi tabla, alguna sugerencia?

    sobre el segundo método no lo había pensado, pero no resulta lo mismo que no muestre el "valor2"?

    miércoles, 27 de julio de 2016 17:35
  • hola 

    quieres encontrar los registros que contengan algo en especifico o quieres que te devuelva todos los registros de la tabla 

    si es un dato en especifico use:

     DbConnection conn = new DbConnection(Globals.DbConnection);
                        DataTable tableUser = new DataTable();
                        string strUser = conn.querySearchSqlUSer(column, target);
                        //consultar Tabla SQL
    
                        SqlCommand userComm = conn.CreateCommand(strUser);
                        tableUser = conn.SqlQuery(userComm);
                        DTG_USUARIOS.DataSource = tableUser;
                        conn.CloseConn();
    
    
    

    El anterior codigo devuelve una tabla con los registros que contengan la palabra "target" en una columna especifica

    si necesita es traer toda la tabla registros entonces :

    public DataTable SqlQuery(SqlCommand command)
            {
                DataTable table = new DataTable();
                SqlDataAdapter da = null;
                try
                {
                    if (conn.State != ConnectionState.Open)
                    {
                        conn.Open();
                    }
                    command.Connection = conn;
                    da = new SqlDataAdapter(command);
                    da.Fill(table);
                }
                catch (Exception exp)
                {
                    throw exp;
                }
                finally
                {
                    if (conn.State == ConnectionState.Open)
                    {
                        conn.Close();
                    }
                    command.Dispose();
                    da.Dispose();
                }
                return table;
            }

    creas un Sql command  y devuelve una tabla completa


    miércoles, 27 de julio de 2016 21:03
  • Hola, si lo que quiero es encontrar los registros que contengan algo en especifico, pero que no se muestre en un dataGrid, si no que en un html table


    miércoles, 27 de julio de 2016 21:26
  • listo facil con el codigo que te di devuelve un datatable 

     DbConnection conn = new DbConnection(Globals.DbConnection);
                        DataTable tableUser = new DataTable();
                        string strUser = conn.querySearchSqlUSer(column, target);
                        //consultar Tabla SQL
    
                        SqlCommand userComm = conn.CreateCommand(strUser);
                       
     tableUser = conn.SqlQuery(userComm);
                       
                        conn.CloseConn();

    despues pasas de datatable a html table con esta funcion 

    public static string ConvertDataTableToHTML(DataTable dt)
        {
            string html = "<table>";
            //add header row
            html += "<tr>";
            for(int i=0;i<dt.Columns.Count;i++)
                html+="<td>"+dt.Columns[i].ColumnName+"</td>";
            html += "</tr>";
            //add rows
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                html += "<tr>";
                for (int j = 0; j< dt.Columns.Count; j++)
                    html += "<td>" + dt.Rows[i][j].ToString() + "</td>";
                html += "</tr>";
            }
            html += "</table>";
            return html;
        }

    Espero te sirva 

    • Marcado como respuesta JlarzateC lunes, 8 de agosto de 2016 16:20
    jueves, 28 de julio de 2016 13:08
  • JlarzateC,

    Pienso que debes separar dos cosas: la forma de obtener los datos y la presentación de dichos datos. Son dos cosas distintas, que se manejan -incluso- en contextos distintos.

    /*lo que quiero es encontrar los registros que contengan algo en especifico*/

    ¿Qué es "algo en especifico"? Si tienes algún criterio de discriminación de filas -ya te lo había comentado- lo mejor es que lo definas en la consulta sql (cláusula WHERE<>), no tiene sentido recuperar todos los datos para luego hacer filtros en memoria. Los datos recuperados puedes cargarlos sobre cualquier estructura, llámese un objeto de tipo DataTable, una matriz, una lista de un tipo custom, etc.

    /*pero que no se muestre en un dataGrid, si no que en un html table*/

    Reitero, no intentes pintar datos sobre una tabla (Tag HTML) si antes no defines como recuperar dichos datos, lo más simple es pintarlos sobre una tabla.

    Esperamos tu feed-back.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 28 de julio de 2016 14:02
  • Hola, si estás en lo correcto, lo ultimo que tengo que ver es donde mostrar la información, lo que ocurre es que mi tabla es un horario,el cual consta de 3 columnas llamadas turnos1,turno2,turno3, la cual tienen 9hrs disponibles como se muestra en la imagen

    donde un usuario va a agendar un dia a partir de un form, otro punto es que ellos al apartar el día lo tienen que ver reflejado en la tabla, lo que menciono de "algo en especifico" es el turno que escogen y de ahí eligen cuantas horas van a ser usadas, puede ser de 1 a 5 o 7 a 9, etc...

    Creo que los turnos los tengo que manejar como objetos, pero realmente no se bien como plantear la idea

    parece ser que  los cmd.Parameters puedo usarlos

    jueves, 28 de julio de 2016 17:25