.NET 3.x System.NullReferenceException - C#
Формулировка задачи:
Здравствуйте. Заранее прошу прощения за большое количество текста.
Пишу домашнюю бухгалтерию (дипломный проект) в VS2008. Есть база на MS SQL Server 2008. Столкнулся с проблемой отрисовки графиков. Необходимо суммирование значений по категориям (продукты, услуги ЖКХ, etc) и из этих значений формируется график.
Таблица Outcome связана с таблицей OutcomeCategory по столбцам category_id - id (первичный ключ в таблице OutcomeCategory).
Чтобы получить сумму расходов по конкретной категории, использую запрос:
где month - это номер месяца, по которому требуется просуммировать записи (номер определяется пользователем через комбобокс).
Отрисовку графика реализую через ZedGraph. Тип графика - pie chart. Чтобы определить количество секторов в диаграмме, использую максимальный id категории расходов (int max_cat_id). Размерность массива сегментов диаграммы была увеличена на единицу, т.к. id начинается тоже с 1.
Сам код формирования секторов диаграммы:
outcomeTA - table adapter таблицы Outcome.
GetSum - тот самый запрос, что я писал выше.
GetName - возвращает название категории расходов в зависимости от её id:
RandomColor - возвращает рандомный цвет:
Проверил это дело на нескольких записях. Поначалу всё было замечательно, графики рисовались. Но по мере добавления записей стали вылезать эксепшены System.NullReferenceException. Опытным путём было выявлено, что графики строятся при наличии записи с category_id = 1. Без неё не строится ничего, будь хоть в таблице сотня записей.
Соответственно теперь вопрос: как это дело исправить? Голову ломаю уже не один день. Заранее большое спасибо.
SELECT SUM(price * quantity) FROM Outcome WHERE (category_id = @category_id) AND (MONTH(DATE) = @MONTH)
PieItem[] segments = new PieItem[max_cat_id + 1]; for (int i = 1; i <= segments.Length - 1; i++) { segments[i] = myPane.AddPieSlice((double)outcomeTA.GetSum(i, month), RandomColor(), RandomColor(), 45f, 0, " " + outcomeCategoryTA.GetName(i).ToString() + ": " + outcomeTA.GetSum(i, month).ToString() + " руб."); }
SELECT name FROM OutcomeCategory WHERE id = @id
private Color RandomColor() { return Color.FromArgb ( rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255) ); }
Решение задачи: «.NET 3.x System.NullReferenceException»
textual
Листинг программы
int i = 0; foreach (PieItem pi in segments) { if (outcomeTA.GetSum(i, month) != null) { segments[i] = myPane.AddPieSlice((double)outcomeTA.GetSum(i, month), RandomColor(), RandomColor(), 45f, 0, " " + outcomeCategoryTA.GetName(i).ToString() + ": " + outcomeTA.GetSum(i, month).ToString() + " руб."); } i++;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д