Am o baza de date SQL Server 2008 și sunt de lucru pe ea în backend. Am de lucru pe asp.net/C#
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
//how do I read strings here????
}
Știu că cititorul are valori. Mea comandă SQL este de a selecta doar 1 coloana dintr-un tabel. Coloana conține DOAR siruri de caractere. Vreau să citesc siruri de caractere (rânduri) în cititor, unul câte unul. Cum fac acest lucru?
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();
sau
string col1Value = rdr[0].ToString();
Acestea sunt obiect, astfel încât aveți nevoie să fie aruncat sau le
.ToString()`.
Pune numele de coloana begin întors din baza de date unde"ColumnName"este. Dacă este un șir de caractere, puteți utiliza
.ToString(). Dacă este un alt tip, aveți nevoie pentru a converti folosind Sistemul.Converti
.
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();
}
va lucra
Pentru un singur rezultat:
if (reader.Read())
{
Response.Write(reader[0].ToString());
Response.Write(reader[1].ToString());
}
Pentru mai multe rezultate:
while (reader.Read())
{
Response.Write(reader[0].ToString());
Response.Write(reader[1].ToString());
}
Gândit să-mi împărtășesc metoda de ajutor pentru cei care pot folosi:
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);
}
}
}
}
}
Utilizare:
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"));
}
}
Helper metodă aruncă la orice valoare vrei, dacă se poate't exprimate sau baza de date valoarea este NULL, rezultatul va fi nul.
Aș argumenta impotriva utilizarea `SqlDataReader aici; ADO.NET are o mulțime de cazuri de margine și complicații, și, din experiența mea mai scris manual ADO.NET codul este rupt in cel puțin un drum (de obicei, subtil și contextuală).
Există instrumente pentru a evita acest lucru. De exemplu, în cazul în care doriți să citiți o coloană de siruri de caractere. Dapper face complet nedureroasa:
var region = ... // some filter
var vals = connection.Query<string>(
"select Name from Table where Region=@region", // query
new { region } // parameters
).AsList();
Dapper aici este de-a face cu toate parametrizare, executie, și rând de prelucrare - și o mulțime de alte grungy detalii de ADO.NET. De <string>
poate fi înlocuit cu <SomeType>
să se materializeze rânduri întregi în obiecte.
Știu că acest lucru este la fel de vechi, dar dacă sunteți de lectură conținutul unui SqlDataReader într-o clasă, atunci acest lucru va fi foarte util. coloana nume de cititor și de clasă ar trebui să fie același
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;
}
Am citit, de obicei date de date cititor de acest fel. adăugat doar un mic exemplu.
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();
}
}