recuperar read mediante leer executereader datos c# asp.net sql-server-2008 sqldatareader

c# - mediante - sqldatareader read



Leer datos de SqlDataReader (11)

Tengo una base de datos de SQL Server 2008 y estoy trabajando en ella en el back-end. Estoy trabajando en asp.net/C#

SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { //how do I read strings here???? }

Sé que el lector tiene valores. Mi comando SQL es seleccionar solo 1 columna de una tabla. La columna contiene cadenas SOLAMENTE. Quiero leer las cadenas (filas) en el lector una por una. ¿Cómo hago esto?


En los términos más simples, si su consulta devuelve column_name y contiene una cadena:

while (rdr.Read()) { string yourString = rdr.getString("column_name") }


En realidad, me di cuenta de que podía hacer esto:

while (rdr.read()) { string str = rdr.GetValue().ToString().Trim(); }


Para un solo resultado:

if (reader.Read()) { Response.Write(reader[0].ToString()); Response.Write(reader[1].ToString()); }

Para resultados múltiples:

while (reader.Read()) { Response.Write(reader[0].ToString()); Response.Write(reader[1].ToString()); }


Pensé compartir mi método de ayuda para aquellos que pueden usarlo:

public static class Sql { public static T Read<T>(DbDataReader DataReader, string FieldName) { int FieldIndex; try { FieldIndex = DataReader.GetOrdinal(FieldName); } catch { return default(T); } if (DataReader.IsDBNull(FieldIndex)) { return default(T); } else { object readData = DataReader.GetValue(FieldIndex); if (readData is T) { return (T)readData; } else { try { return (T)Convert.ChangeType(readData, typeof(T)); } catch (InvalidCastException) { return default(T); } } } } }

Uso:

cmd.CommandText = @"SELECT DISTINCT [SoftwareCode00], [MachineID] FROM [CM_S01].[dbo].[INSTALLED_SOFTWARE_DATA]"; using (SqlDataReader data = cmd.ExecuteReader()) { while (data.Read()) { usedBy.Add( Sql.Read<String>(data, "SoftwareCode00"), Sql.Read<Int32>(data, "MachineID")); } }

El método de ayuda arroja a cualquier valor que desee, si no puede transmitir o si el valor de la base de datos es NULO, el resultado será nulo.


Ponga el nombre de la columna que comienza en la base de datos donde está "ColumnName" . Si es una cadena, puede usar .ToString() . Si es de otro tipo, debe convertirlo utilizando System.Convert .

SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { string column = rdr["ColumnName"].ToString(); int columnValue = Convert.ToInt32(rdr["ColumnName"]); }


Sé que esto es algo antiguo, pero si estás leyendo los contenidos de un SqlDataReader en una clase, entonces será muy útil. los nombres de columna del lector y la clase deben ser iguales

public static List<T> Fill<T>(this SqlDataReader reader) where T : new() { List<T> res = new List<T>(); while (reader.Read()) { T t = new T(); for (int inc = 0; inc < reader.FieldCount; inc++) { Type type = t.GetType(); string name = reader.GetName(inc); PropertyInfo prop = type.GetProperty(name); if (prop != null) { if (name == prop.Name) { var value = reader.GetValue(inc); if (value != DBNull.Value) { prop.SetValue(t, Convert.ChangeType(value, prop.PropertyType), null); } //prop.SetValue(t, value, null); } } } res.Add(t); } reader.Close(); return res; }


Tengo una función auxiliar como:

public static string GetString(object o) { if (o == DBNull.Value) return ""; return o.ToString(); }

luego lo uso para extraer la cadena:

tbUserName.Text = GetString(reader["UserName"]);


Yo argumentaría en contra de usar SqlDataReader aquí; ADO.NET tiene muchos casos extremos y complicaciones, y en mi experiencia, la mayoría del código ADO.NET escrito manualmente está roto al menos en una forma (generalmente sutil y contextual).

Existen herramientas para evitar esto. Por ejemplo, en el caso aquí, quiere leer una columna de cadenas. Dapper hace completamente indoloro:

var region = ... // some filter var vals = connection.Query<string>( "select Name from Table where Region=@region", // query new { region } // parameters ).AsList();

Dapper aquí trata con toda la parametrización, ejecución y procesamiento de filas, y muchos otros detalles sucios de ADO.NET. El <string> se puede reemplazar con <SomeType> para materializar filas enteras en objetos.


string col1Value = rdr["ColumnOneName"].ToString();

o

string col1Value = rdr[0].ToString();

Estos son object , por lo que necesita lanzarlos o .ToString ().


using(SqlDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { var myString = rdr.GetString(0); //The 0 stands for "the 0''th column", so the first column of the result. // Do somthing with this rows string, for example to put them in to a list listDeclaredElsewhere.Add(myString); } }


while(rdr.Read()) { string col=rdr["colName"].ToString(); }

va a funcionar