J'ai une base de données SQL Server 2008 et j'y travaille dans le backend. Je travaille sur asp.net/C#
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
//how do I read strings here????
}
Je sais que le lecteur a des valeurs. Ma commande SQL consiste à sélectionner une seule colonne dans une table. La colonne contient des chaînes SEULEMENT. Je veux lire les chaînes (lignes) du lecteur une à une. Comment puis-je faire cela?
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);
}
}
string col1Value = rdr["ColumnOneName"].ToString();
ou
string col1Value = rdr[0].ToString();
Ce sont object
s, vous devez donc les lancer ou .ToString()
.
Placez le nom de la colonne begin renvoyée de la base de données où "ColumnName"
est. Si c'est une chaîne, vous pouvez utiliser .ToString()
. S'il s'agit d'un autre type, vous devez le convertir à l'aide de System.Convert
.
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
string column = rdr["ColumnName"].ToString();
int columnValue = Convert.ToInt32(rdr["ColumnName"]);
}
while(rdr.Read())
{
string col=rdr["colName"].ToString();
}
ça va marcher
Pour un seul résultat:
if (reader.Read())
{
Response.Write(reader[0].ToString());
Response.Write(reader[1].ToString());
}
Pour des résultats multiples:
while (reader.Read())
{
Response.Write(reader[0].ToString());
Response.Write(reader[1].ToString());
}
Pensé pour partager ma méthode d'assistance pour ceux qui peuvent l'utiliser:
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);
}
}
}
}
}
Usage:
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"));
}
}
La méthode d'assistance attribue la valeur souhaitée, si elle ne peut pas être convertie ou si la valeur de la base de données est NULL, le résultat sera null.
En fait, je me suis dit que je pouvais faire ceci:
while (rdr.read())
{
string str = rdr.GetValue().ToString().Trim();
}
En termes simples, si votre requête retourne nom_colonne et qu'elle contient une chaîne:
while (rdr.Read())
{
string yourString = rdr.getString("column_name")
}
Je sais que c'est un peu vieux, mais si vous lisez le contenu d'un SqlDataReader dans une classe, alors ce sera très pratique. les noms de colonne du lecteur et de la classe doivent être identiques
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;
}
J'ai une fonction d'assistance comme:
public static string GetString(object o)
{
if (o == DBNull.Value)
return "";
return o.ToString();
}
alors je l'utilise pour extraire la chaîne:
tbUserName.Text = GetString(reader["UserName"]);
Je dirais que contre en utilisant SqlDataReader
ici; ADO.NET a beaucoup de cas Edge et de complications, et selon mon expérience, le code ADO.NET écrit manuellement est divisé en au moins d'une manière (généralement subtile et contextuelle).
Des outils existent pour éviter cela. Par exemple, dans le cas présent, vous voulez lire une colonne de chaînes. Dapper rend cela complètement indolore:
var region = ... // some filter
var vals = connection.Query<string>(
"select Name from Table where Region=@region", // query
new { region } // parameters
).AsList();
Dapper s’occupe ici de tout le paramétrage, de l’exécution et du traitement des lignes - ainsi que de nombreux autres détails déplaisants d’ADO.NET. Le <string>
peut être remplacé par <SomeType>
pour matérialiser des lignes entières dans des objets.
J'ai l'habitude de lire les données par lecteur de données de cette façon. vient d'ajouter un petit exemple.
string connectionString = "Data Source=DESKTOP-2EV7CF4;Initial Catalog=TestDB;User ID=sa;Password=tintin11#";
string queryString = "Select * from EMP";
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(queryString, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1]));
}
}
reader.Close();
}
}