#c# #sql-server
#c# #sql-server
Вопрос:
Я пытаюсь получить несколько скалярных значений из одной таблицы.
Это мой запрос:
cmd.CommandText = "SELECT MAX(column1) AS bmax,"
"MIN(column1) AS bmin,"
"MAX(column2) AS amax, "
"MIN(column2) AS amin,"
"MAX(column3) AS cmax,"
"MIN(column3) AS cmin "
"FROM MainTable WHERE AND year > " (DateTime.Today.Year - 1);
Как я могу прочитать значения из нее? Я уже пробовал следующее и просматривал SqlDataReader
документ в msdn:
int.Parse(dr["bmax"].ToString());
int.Parse(dr[0].ToString());
int.Parse(dr[0][0].ToString());
int.Parse(dr.GetSqlValue(0).ToString());
Я знаю, что запрос работает, потому что, когда я получаю исключение из одного из моих испытаний, я могу навести курсор на SqlDataReader
объект и перейти к просмотру результатов>>> [0]{system.data.common.datarecordinternal}
>>> непубличные члены >>> _values{object[6]}
Я вижу 6 строк со значениями, которые я пытался получить.
Я знаю, что могу получить каждое значение отдельно, используя 6 разных запросов и to ExecuteScalar
, но я хотел бы использовать один и тот же запрос, если это возможно
Комментарии:
1. какое исключение вы получаете? это исключение с нулевой ссылкой?
2. опубликуйте полный блок C #. Здесь нет инструкции Read(). Если это ваш полный код, то сначала вам нужно dr.Read() . Не уверен, почему вы увидите 6 строк, возвращаемое значение должно быть только одной строкой, поскольку, похоже, все это совокупные значения
Ответ №1:
Вы можете использовать следующий фрагмент:
int bmax, bmin;
using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
if (!reader.IsDBNull(0))
bmax = reader.GetInt32(0);
if (!reader.IsDBNull(1))
bmin = reader.GetInt32(1);
// and so on
}
}
Пожалуйста, обратите внимание, что это даст вам результат для первой строки из результатов вашего запроса.
Если в результирующем наборе должно быть несколько строк, рассмотрите возможность использования while (reader.Read())
цикла.
Ответ №2:
если я правильно понял ваш вопрос, что-то вроде этого должно помочь:
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
string str0 = reader[0].ToString();
string str1 = reader[1].ToString();
string str2 = reader[2].ToString();
}
}
Комментарии:
1. Я бы не стал использовать reader [0], используйте имя столбца, таким образом, если запрос когда-либо изменит порядок по какой-либо причине, это вас не убьет. Кроме того, возвращаемые значения являются числовыми, не уверен, зачем использовать строки.
2. согласен, но я не знаю названий столбцов 🙂 , тем не менее, я должен был что-то написать об этом. хороший совет!