Principales respuestas
Busqueda dentro de un Data Reader

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
Respuestas
-
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.
- Propuesto como respuesta José De AlvaModerator lunes, 1 de agosto de 2016 19:55
- Marcado como respuesta José De AlvaModerator martes, 2 de agosto de 2016 14:52
-
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
Todas las respuestas
-
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();
- Propuesto como respuesta Laura CeglzModerator viernes, 29 de julio de 2016 14:55
- Votado como útil Laura CeglzModerator viernes, 29 de julio de 2016 14:55
-
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 -
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
-
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.
- Propuesto como respuesta José De AlvaModerator lunes, 1 de agosto de 2016 19:55
- Marcado como respuesta José De AlvaModerator martes, 2 de agosto de 2016 14:52
-
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- Propuesto como respuesta José De AlvaModerator lunes, 1 de agosto de 2016 19:55
- Marcado como respuesta José De AlvaModerator martes, 2 de agosto de 2016 14:52
- Desmarcado como respuesta JlarzateC lunes, 8 de agosto de 2016 16:20
-
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"?
-
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
- Editado Felipe Hurtado miércoles, 27 de julio de 2016 21:04
-
-
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
-
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. -
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