jamesmc1535 Ответов: 2

Ссылка на объект не установлена на экземпляр объекта. Ошибка.


привет, у меня есть datagrid, подключенный к базе данных, рядом с ним есть 2 кнопки, 1-update 2-refresh ,
кнопка один обновляет datagrid с вновь введенными записями в то время как обновление просто обновляет ,
вот код
 public partial class Form1 : Form
    {
        SqlDataAdapter sda;
        SqlCommandBuilder scb;
        DataTable dt;

        public Form1()
        {
           
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'testDataSet.loanf' table. You can move, or remove it, as needed.
            this.loanfTableAdapter.Fill(this.testDataSet.loanf);
          

        }

        private void btnRefresh_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection("Data Source=JAMES-PC\\SQLEXPRESS;Initial Catalog=test;Integrated Security=True");
            sda = new SqlDataAdapter(@"SELECT NAME, AMOUNT, DATE
                                    FROM        loanf",con);
            dt = new DataTable();
            sda.Fill(dt);
            dataGridView1.DataSource = dt;


        }

        private void btnUpdate_Click(object sender, EventArgs e)
        {
            scb = new SqlCommandBuilder(sda);
            sda.Update(dt); 
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
    }
}

но всякий раз, когда я нажимаю на кнопку обновить, чтобы сохранить записи, я получаю ошибку _>
Object reference not set to an instance of an object .  thanks in advance :)

What I have tried:

google,,youtube
changing tables
recreating whole program
recreating tables
changing keys

ZurdoDev

Это очень легкая вещь для вас, чтобы исправить. Что-то пусто, и вам нужно это исправить.

jamesmc1535

но куда? XD, начиная все сначала, так как я не вижу нулевого значения,

ZurdoDev

- Куда? Мы не можем знать наверняка. Но когда вы запустите его, код где-то остановится и выдаст вам эту ошибку. Вот на что вам нужно обратить внимание.

jamesmc1535

АСД.Обновление (dt);

ZurdoDev

Итак, что же в этой строке равно нулю? Скорее всего, ДТ. Но вы должны его отладить.

[no name]

Используйте отладчик, отлаживайте его построчно, тогда вы сможете увидеть, какая строка вызывает исключение.

jamesmc1535

спасибо я постараюсь сделать это быстро

jamesmc1535

ПДД.Обновление(ДТ); &ЛТ;

Sergey Alexandrovich Kryukov

В каком направлении?
—СА

jamesmc1535

АСД.Обновление (dt);

Sergey Alexandrovich Kryukov

Проверьте, является ли ПДД нулевым в момент вызова... Следуйте инструкциям, которые я описал в своем ответе...
—СА

jamesmc1535

спасибо, я исправил это, datagrid обновляется в базе данных теперь без проблем, но я не могу удалить строку в datagrid ( так как у меня нет collum в качестве первичного ключа , но когда я устанавливаю collum в primary, я получаю эту нулевую ошибку

Sergey Alexandrovich Kryukov

Почему нет первичного ключа? Во всяком случае, ничто не мешает вам удалить строку. Чтобы исправить еще одно нулевое исключение, выполните действия, которые я описал еще раз... :-)
—СА

jamesmc1535

спасибо за помощь , :)

2 Ответов

Рейтинг:
6

Sergey Alexandrovich Kryukov

Вы не показали, где возникает исключение с сообщением "ссылка на объект не установлена на экземпляр объекта".

Не беспокоиться. Это один из самых простых случаев для обнаружения и исправления. Это просто означает, что некоторый член / переменная некоторого ссылочного типа разыменовывается с помощью и своих экземпляров (нестатических) членов, что требует, чтобы этот член / переменная не была нулевой, но на самом деле она кажется нулевой. Просто запустите его в отладчике; он остановит выполнение при возникновении исключения. Поставьте точку останова на этой строке, перезапустите приложение и снова перейдите к этой точке. Оцените все ссылки, включенные в следующую строку, и посмотрите, какая из них пустая, хотя она не должна быть нулевой. После того, как вы это выясните, исправьте код: либо убедитесь, что член / переменная правильно инициализирована ненулевой ссылкой, либо проверьте ее на null и, в случае null, сделайте что-нибудь еще.

Пожалуйста, смотрите также: хотите отобразить следующую запись при нажатии кнопки. но получил ошибку в том случае, если условие следующей функции записи "ссылка на объект не установлена на экземпляр объекта".

Иногда вы не можете сделать это под отладчиком по той или иной причине. Один действительно неприятный случай - это когда проблема проявляется только в том случае, если программное обеспечение построено, когда отладочная информация недоступна. В этом случае вам придется использовать более сложный способ. Во-первых, вам нужно убедиться, что вы никогда не блокируете распространение исключений, обрабатывая их молча (это преступление разработчиков против самих себя, но очень обычное). Вам нужно поймать абсолютно все исключения на самом верхнем кадре стека каждого потока. Вы можете сделать это, если будете обрабатывать исключения этого типа System.Exception В обработчике вам нужно записать всю информацию об исключениях, особенно System.Exception.StackTrace:
http://msdn.microsoft.com/en-us/library/system.exception.aspx,
http://msdn.microsoft.com/en-us/library/system.exception.stacktrace.aspx.

Трассировка стека - это просто строка, показывающая полный путь распространения исключения от оператора throw к обработчику. Читая его, всегда можно найти концы. Для ведения журнала лучше всего (в большинстве случаев) использовать класс System.Diagnostics.EventLog:
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx.

Удачи,

—СА


Рейтинг:
16

OriginalGriff

Это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, в котором вы держите ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего такого, что обычно делали бы, когда извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, на которой она обнаружила проблему. Затем вы можете начать смотреть на различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы выяснить, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы сможете узнать!


jamesmc1535

очень хорошее объяснение , Я понятия не имею, где я ошибся , делая это снова и снова:) большое спасибо

OriginalGriff

Пожалуйста!