Как получить несколько МАКСИМАЛЬНЫХ и минимальных значений из таблицы SQL Server с помощью C#

#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. согласен, но я не знаю названий столбцов 🙂 , тем не менее, я должен был что-то написать об этом. хороший совет!