Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C#] Cсылка на объект не указывает на экземпляр об 
:(
    Опции темы
Lii
Дата 5.4.2011, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



Объясните пожалуйста почему ссылка равна нулю? 

Вот  код: 
Код

   public partial class Profit : Form
    {
        public MySqlConnection Connection { get; set; }
        public int ContractNumber { get; private set; }
  
        public Profit()
        {
            InitializeComponent();
        }

        private void Profit_Load(object sender, EventArgs e)
        {
            string query = string.Format("select count(name) " +
                                            "from contract");
            
            MySqlCommand command = Connection.CreateCommand();
            MySqlDataReader Reader;
            command.CommandText = query;
            try
            {
                Connection.Open();
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.ToString(), "Ошибка");
                return;
            }

            Reader = command.ExecuteReader();
            
            while (Reader.Read())
            {
                textBox1.Text = Reader.GetValue(0).ToString(); // COUNT
            }
            Connection.Close();
            Reader.Close();
        }
    }

PM MAIL   Вверх
Competitor
Дата 5.4.2011, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: -1
Всего: -1



какая ссылка равно нулю то?
PM MAIL WWW   Вверх
Lii
Дата 5.4.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



ссылка на объект. эта ошибка (Cсылка на объект не указывает на экземпляр объекта) возникает ведь именно в том случае, когда ссылается на null
PM MAIL   Вверх
Экскалупатор
Дата 5.4.2011, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



а где ты инициализируешь объект?
у тебя есть свойство:
Код

 public MySqlConnection Connection { get; set; }

ты вызываешь его get, а где ты вносишь в это свойство какое нибудь значение?
PM MAIL ICQ   Вверх
bend0r
Дата 5.4.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 14.9.2005

Репутация: 1
Всего: 2



MySqlConnection не использовал но подозреваю что он не статический, в Connection не присвоен обьект
PM MAIL   Вверх
Lii
Дата 5.4.2011, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



Вот так теперь:

Код

public partial class Profit : Form
    {
        private MySqlConnection Сonnection;

        public Profit(MySqlConnection _connection)
        {
            InitializeComponent();
            Сonnection = _connection;
        }

        private void Profit_Load(object sender, EventArgs e)
        {
            string query = string.Format("select count(name) " +
                                            "from contract");


            MySqlCommand command = new MySqlCommand(query, Сonnection);
            command.CommandText = query;
            try
            {
                command.Connection.Open(); 
            
            }
            catch (Exception ee)
            {
              
                MessageBox.Show(ee.ToString(), "Ошибка");
                return;
            }

         
            textBox1.Text = ((int)command.ExecuteScalar()).ToString(); // COUNT
           
            Сonnection.Close();
            this.Close();
          
        }
    } [quote]

[/quote]


соединяюсь с базой на другой форме с помощью строк: 
Код

_connection = new MySqlConnection("Server=localhost;Database=orders;Uid=root;Pwd=");
MySqlCommand command = _connection.CreateCommand(); 


На главной и других формах всё работает 
PM MAIL   Вверх
Экскалупатор
Дата 5.4.2011, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



Цитата(Lii @  5.4.2011,  15:47 Найти цитируемый пост)

На главной и других формах всё работает  

а где не работает?
Код

 public Profit(MySqlConnection _connection)

ты передаешь инициализированный объект?
PM MAIL ICQ   Вверх
Lii
Дата 6.4.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



всего 6 форм, из них не работает только эта 
на главной объявляется и инициализируется _connection:

 
Код

_connection = new MySqlConnection("Server=lily;Database=orders;Uid=root;Pwd=");



вызываю не работающую форму так: 
  
Код

private void profitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Profit Pr = new Profit(_connection);
            Pr.ShowDialog();
        } 



выводит ошибку System.ArgumentNullException ключ не может быть неопределённым
PM MAIL   Вверх
Экскалупатор
Дата 6.4.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



Lii, покажи код обоих форм ту которую вызываешь и ту которая вызывает
PM MAIL ICQ   Вверх
Lii
Дата 6.4.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



Главная форма:
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.Globalization;
using SkeinFish;

namespace OrderReporter
{
    public partial class MainForm : Form
    {
        MySqlConnection _connection;
        private DataSet _dataSet;
        private MySqlDataAdapter filler;

        public MainForm()
        {
            InitializeComponent();
            UpdateContractsList();
            dgvGrid.Paint += dgvGrid_Paint;
            dgvGrid.CellMouseDoubleClick += dgvGrid_CellMouseDoubleClick;
        }

        
        void UpdateContractsList()
        {
            _connection = new MySqlConnection("Server=localhost;Database=orders;Uid=root;Pwd=");
            MySqlCommand command = _connection.CreateCommand();

            command.CommandText = "select contract.number, contract.name, domain.name, DATE_FORMAT(payment.payment_date, \"%d.%c.%Y\"), DATE_FORMAT(hosting.end_date_host, \"%d.%c.%Y\"), DATE_FORMAT(domain.end_registration_date, \"%d.%c.%Y\")  " +
                                  "from contract, domain, payment, hosting " +
                                  "where contract.number=domain.contract_number and contract.number=payment.contract_number and contract.number=hosting.contract_number";
            
            try
            { 
            filler = new MySqlDataAdapter(command);
            _dataSet = new DataSet();
            filler.Fill(_dataSet);
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.ToString(), "Ошибка");
                return;
            } 
            dgvGrid.AutoGenerateColumns = false;
            dgvGrid.DataSource = _dataSet.Tables[0];
            for (int i = 0; i < dgvGrid.Columns.Count; i++)
                dgvGrid.Columns[i].DataPropertyName = _dataSet.Tables[0].Columns[i].ColumnName;            
        }

        void dgvGrid_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            int cn = int.Parse(dgvGrid.Rows[e.RowIndex].Cells[0].Value.ToString());
            FrmClientInfo frmInfo = new FrmClientInfo(cn);
            frmInfo.Connection = _connection;
            if (frmInfo.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                UpdateContractsList();            
        }

        void dgvGrid_Paint(object sender, PaintEventArgs e)
        {
            PaintGrid();
        }

        private void PaintGrid()
        {
            for (int i = 0; i <= dgvGrid.Rows.Count - 1; i++)
            {
                string str = dgvGrid.Rows[i].Cells[4].Value.ToString();
                DateTime date = Convert.ToDateTime(str);
                if (date < DateTime.Now)
                    dgvGrid.Rows[i].DefaultCellStyle.BackColor = Color.Red;
            }
        }

        private void CloseToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void AddToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmAdd fAdd = new frmAdd(_connection);
            if (fAdd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                UpdateContractsList();
        }

        private void showReportToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Domains dmns = new Domains();

            string query = string.Format("select domain.name, payment.payment_value " +
                                         "from domain, payment " +
                                         "where domain.contract_number=payment.contract_number");

            MySqlCommand command = _connection.CreateCommand();
            MySqlDataReader Reader;
            command.CommandText = query;

            try
            {
                _connection.Open();
            }
            catch (Exception ee)
            {
               MessageBox.Show(ee.ToString(), "Ошибка");
                return;
            }

            Reader = command.ExecuteReader();

            while (Reader.Read())
                dmns.AddDomain(
                        Reader.GetValue(0).ToString(), 
                        Convert.ToDouble(Reader.GetValue(1)) 
                    );
            
            _connection.Close();
            
            frmReport fRep = new frmReport(dmns);
            fRep.ShowDialog();
        }

        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            Environment.Exit(0);
        }

        private void tableDataBindingSource_CurrentChanged(object sender, EventArgs e)
        {

        }

        private void profitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Profit Pr = new Profit(_connection);// здесь вызываю неработающую форму
            Pr.ShowDialog();
        }      
    }
}



код неработающей формы:

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace OrderReporter
{
    public partial class Profit : Form
    {
        private MySqlConnection Сonnection;

        public Profit(MySqlConnection _connection)
        {
            InitializeComponent();
            Сonnection = _connection;
        }

        private void Profit_Load(object sender, EventArgs e)
        {
            string query = string.Format("select count(name) " +
                                            "from contract");


            MySqlCommand command = new MySqlCommand(query, Сonnection);


            try
            {
                command.Connection.Open();
                textBox1.Text = ((int)command.ExecuteScalar()).ToString();
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.ToString(), "Ошибка");
                return;
            }

            Сonnection.Close();
            this.Close();

        }
    }
}



PM MAIL   Вверх
Экскалупатор
Дата 6.4.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



попробуй поменять местами
Код

            InitializeComponent();
            Сonnection = _connection;

т.е. что бы было
Код

            Сonnection = _connection;
            InitializeComponent();

PM MAIL ICQ   Вверх
Lii
Дата 6.4.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



то же самое

пересоздала проект, теперь ошибка не появляется, но всё равно значение в textbox не заносится 
PM MAIL   Вверх
Экскалупатор
Дата 6.4.2011, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



ну если ошибка не появляется значит Connection уже не null. вопрос что он делает, запусти в дебаге и посмотри что происходит.

а то что форма  закрывается сразу после открытия это нормально?
this.Close();

вообще я бы лучше весь этот код(который в событии _Load) вынес в отдельный метод
PM MAIL ICQ   Вверх
wester
Дата 6.4.2011, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: 4
Всего: 13



Lii 
а прямой каст валидный ?
textBox1.Text = ((int)command.ExecuteScalar()).ToString();
вот достаточно странная строка. Сначала приводим к int, а потом значение переводим в значение в строковой тип.
можно посоветовать только, что возвращает запрос, и каково значение command.ExecuteScalar в отладчике. Для этого можно поставить breakpoint в IDE.

ну и совет из разряда хорошего кода - пишите операторы SQL большим буквами, к примеру "SELECT * FROM Customers". Это повышает удобство и поддержку кода.
PM MAIL   Вверх
Lii
Дата 6.4.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



происходит вот что:        Невозможно вычислить выражение, поскольку фрейм машинного кода находится на вершине стека вызовов.    


Она кстати не закрывается
Она просто открывается и всё, дальше видимо ошибка и ничего не происходит

вынесу потом 

Цитата

textBox1.Text = ((int)command.ExecuteScalar()).ToString();
вот достаточно странная строка. Сначала приводим к int, а потом значение переводим в значение в строковой тип.


сначала же подсчитываем а потом чтобы записать в текстбокс - переводим в строку, я и другим способом пробовала, но толку нет, выполнение видимо до этого момента не идёт 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.