Member 14918214 Ответов: 2

Не удается вытащить сумму с помощью intscalar


Я пытаюсь извлечь сумму суммы из базы данных mySql, используя intScalar-запрос.

Это вызывающий код (класс DBConnect подключается к базе данных):

Датавремя reportStart = начальная дата.Дата;

DBConnect reportConn = новый DBConnect();
MySqlCommand reportQuery = новая MySqlCommand();

reportQuery.CommandText = @"выберите sum(сумма) в качестве итога
От dbo.таблица
где создано <= @startDate";

reportQuery.Параметры.Добавить("@параметр StartDate", MySqlDbType.Дата).Значение = reportStart.Дата;
int xOutstanding = reportConn.intScalar(reportQuery);
lblRewardsDateX.Текст = xOutstanding.Метод toString();

А интскалар:

public int intScalar(MySqlCommand cmd)
      {
          int returnInt = -1;

          try
          {
              this.OpenConnection();
              cmd.Connection = connection;

              //ExecuteScalar will return one value
              returnInt = Convert.ToInt32(cmd.ExecuteScalar());
              this.CloseConnection();
              return returnInt;

          }
          catch (Exception ex)
          {
              MessageBox.Show(ex.Message);
          }
          return returnInt;
      }

Однако это создает исключение:
Object cannot be cast from DBNull to other types.


Я дважды проверил параметр, передаваемый команде, и он не является нулевым. Так почему же он бросает исключение?

Что я уже пробовал:

Проанализировал параметр, чтобы убедиться, что он не является нулевым значением

Gerry Schmitz

Верните объект и приведите / введите, чтобы увидеть, что он на самом деле возвращает. Реальность не заботится о том, что мы думаем.

2 Ответов

Рейтинг:
2

Member 14918214

Обновление инструкции SELECT в запросе до

SELECT IFNULL(sum(amount), 0) as total


сработало!


Рейтинг:
18

F-ES Sitecore

Если вы делаете сумму без строк, вы получаете NULL обратно, так что нет никаких строк, которые удовлетворяют вашему запросу. Вы можете справиться с этим в своем коде, посмотрев, возвращает ли ExecuteScalar DNBull и если он действительно принимает значение 0 (или все, что вы хотите сделать в этом случае), а если нет, то преобразуйте его в int. Или вы могли бы справиться с этим в своем SQL, делая что-то вроде

SELECT IFNULL(sum(amount), 0) as total ...


Это вернет 0, если сумма равна нулю, в противном случае возвращает сумму. Таким образом, ваш SQL гарантированно вернет число, так что вы знаете, что ваше преобразование в int будет работать.