C# Visual Studio и базы данных: ошибочное использование идентификатора
Продолжим разбираться с увлекательным миром баз данных в C# на примере Microsoft SQL Server Compact. В этой статье мы немного подкорректируем нашу программку и сделаем это зря. Я покажу пример, как не надо делать, как не надо строить архитектуру базы данных изначально.
Если вы попробуете изменить столбец id, то увидите вот такую ошибку.
В чем дело? Дело в том, что мы пытаемся изменить параметр, но при этом предполагаем, что он не изменился. Другими словами, мы пытаемся присвоить значение параметру, но считаем, что он неизменен. Как выйти из такой ситуации? Напрашивается решение просто сохранить предыдущее значение параметра, как-то идентифицировать строку в таблице и потом уже, без привязки к старому id, поменять его на новый. Это можно сделать, к примеру, так.
Вводим две переменные: старое (текущее) значение id, новое и флаг – было ли оно изменено:
int oldId = 0; int newId = 0; Boolean flag = false;Добавляем обработчик, запоминающий значение, кода ячейка получает фокус:
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e) { flag = false; if ((dataGridView1.CurrentCell.ColumnIndex == 0) && (dataGridView1.CurrentCell.RowIndex < dataGridView1.RowCount-1)) { oldId = Convert.ToInt32(dataGridView1.CurrentCell.Value); } }Обработчик, получающий новое значение id, когда покидаем ячейку:
private void dataGridView1_CellLeave(object sender, DataGridViewCellEventArgs e) { if ((dataGridView1.CurrentCell.ColumnIndex == 0) && (dataGridView1.CurrentCell.RowIndex < dataGridView1.RowCount-1)) { newId = Convert.ToInt32(dataGridView1.CurrentCell.Value); } }Обработчик, меняющий флаг, если значение ячейки было изменено:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (oldId != newId) flag = true; }Он нужен отдельно, так как наличие фокуса не означает, что пользователь изменил что-то в ячейке.
Однако все эти ухищрения и костыли не стоит делать. Даже со всеми этими приложение не будет работать корректно. Нам еще потребуется отлавливать исключения, и все равно то нарушим параллелизм, то что-то еще – программа постоянно будет выдавать ошибки. А все почему? А потому, что мы изначально выбрали неправильный подход.
Дело в том, что id – это не всегда номер по порядку. Строго говоря, даже неправильно использовать его в качестве номера – это просто идентификатор. Номера могут меняться, а вот идентификатор – не может. То есть решение проблемы выше неправильно: верно будет создать еще один столбец в таблице с номерами книг и выводить уже его – а столбец идентификаторов не трогать; использовать его только по прямому назначению, идентификации.
Именно этим мы и займемся в следующей статье.
Продолжение следует...
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.