Чтение данных из SqlDataReader
У меня есть база данных SQL Server 2008, и я работаю над ней в бэкэнд. Я работаю над asp.net/С#
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
//how do I read strings here????
}
Я знаю, что у читателя есть ценности. Моя команда SQL состоит в том, чтобы выбрать только 1 столбец из таблицы. Столбец содержит только строки. Я хочу читать строки (строки) в читателе один за другим. Как это сделать?
Ответы
Ответ 1
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);
}
}
Ответ 2
string col1Value = rdr["ColumnOneName"].ToString();
или же
string col1Value = rdr[0].ToString();
Это object
s, поэтому вам нужно либо привести их в действие, либо .ToString()
.
Ответ 3
Поместите имя начального столбца из базы данных, где "ColumnName"
. Если это строка, вы можете использовать .ToString()
. Если это другой тип, вам нужно его преобразовать с помощью System.Convert
.
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
string column = rdr["ColumnName"].ToString();
int columnValue = Convert.ToInt32(rdr["ColumnName"]);
}
Ответ 4
while(rdr.Read())
{
string col=rdr["colName"].ToString();
}
it wil work
Ответ 5
Для одного результата:
if (reader.Read())
{
Response.Write(reader[0].ToString());
Response.Write(reader[1].ToString());
}
Для нескольких результатов:
while (reader.Read())
{
Response.Write(reader[0].ToString());
Response.Write(reader[1].ToString());
}
Ответ 6
Мысль поделиться моим вспомогательным методом для тех, кто может его использовать:
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);
}
}
}
}
}
Использование:
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"));
}
}
Вспомогательный метод использует любое значение, которое вам нравится, если оно не может быть выполнено, или значение базы данных равно NULL, результат будет равен нулю.
Ответ 7
Собственно, я сам понял, что могу это сделать:
while (rdr.read())
{
string str = rdr.GetValue().ToString().Trim();
}
Ответ 8
В простейших терминах, если ваш запрос возвращает имя_столбца и содержит строку:
while (rdr.Read())
{
string yourString = rdr.getString("column_name")
}
Ответ 9
Я знаю, что это довольно старый, но если вы читаете содержимое SqlDataReader в классе, то это будет очень удобно. имена столбцов читателя и класса должны быть одинаковыми
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;
}
Ответ 10
У меня есть вспомогательная функция вроде:
public static string GetString(object o)
{
if (o == DBNull.Value)
return "";
return o.ToString();
}
то я использую его для извлечения строки:
tbUserName.Text = GetString(reader["UserName"]);
Ответ 11
Я бы поспорил против использования SqlDataReader
здесь; ADO.NET имеет множество крайних случаев и сложностей, и, по моему опыту, большинство написанного вручную кода ADO.NET нарушается по крайней мере одним способом (обычно тонким и контекстным).
Инструменты существуют, чтобы избежать этого. Например, в случае здесь вы хотите прочитать столбец строк. Dapper делает это совершенно безболезненным:
var region = ... // some filter
var vals = connection.Query<string>(
"select Name from Table where [email protected]", // query
new { region } // parameters
).AsList();
Dapper здесь имеет дело со всей параметризацией, выполнением и обработкой строк - и множеством других шероховатых деталей ADO.NET. <string>
можно заменить на <SomeType>
для материализации целых строк в объекты.
Ответ 12
Я обычно читаю данные читателем данных таким образом. просто добавил небольшой пример.
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();
}
}
Ответ 13
Что если в имени столбца есть квадратные скобки из-за наличия пробела?
sClientCode = stDataReader.Item("[Код клиента]"). ToString()
[Код клиента] Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.IndexOutOfRangeException: [код клиента]
Ошибка источника:
Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местонахождении исключения может быть идентифицирована с помощью приведенной ниже трассировки стека исключений.