Необработанное исключение типа ' System.Данные.Oledb для.OleDbException ' произошло в системе.Данные.dll c#


Я уже создал windows forms, функция которой заключается в добавлении информации в базу данных. Но у меня есть проблема. Когда я набираю номер, подобный этому "SM0001" в столбце "код продукта", и нажимаю enter, он хранит данные в базе данных, и когда я набираю тот же номер, что и раньше, это не мешает пользователю, как введенный "код продукта" уже существует в базе данных. Итак, это моя текущая база данных (отображается в datagridview в окне система):

Введите описание изображения здесь

Как вы можете видеть, строка " 1 "и строка" 2 "имеют одинаковый"код продукта".. Мой вопрос: Как я могу запретить пользователю вводить один и тот же номер дважды?

Я уже изменил первичный ключ в базе данных на "код продукта", но вот ошибка, которую я получаю:

Ошибка такова:

An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll

Additional information: The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. Change the data in the field or fields that contain duplicate data, remove the index, or redefine the index to permit duplicate entries and try again.

Ошибка включена:

cmd.ExecuteNonQuery();

По этой функции:

private void AddDatabase(object sender, EventArgs e)
        {
            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                string query = "INSERT INTO [Table] ([ProductCode], [Description], [Price]) VALUES (@ProductCode, @Description, @Price)";
                conn.Open();
                using (OleDbCommand cmd = new OleDbCommand(query, conn))
                {
                    cmd.Parameters.Add("@ProductCode", System.Data.OleDb.OleDbType.VarChar);
                    cmd.Parameters["@ProductCode"].Value = this.numericTextBox1.Text;
                    cmd.Parameters.Add("@Description", System.Data.OleDb.OleDbType.VarChar);
                    cmd.Parameters["@Description"].Value = this.textBox3.Text;
                    cmd.Parameters.Add("@Price", System.Data.OleDb.OleDbType.Integer);
                    cmd.Parameters["@Price"].Value = this.textBox4.Text;
                    cmd.ExecuteNonQuery(); // The error is here
                    if (_choice.comboBox1.Text == "English")
                    {
                        System.Media.SoundPlayer _sound = new System.Media.SoundPlayer(@"C:WindowsMediaWindows Exclamation.wav");
                        _sound.Play();
                        DialogResult _dialogResult = MessageBox.Show("Added Successfully!", "Success", MessageBoxButtons.OK);
                        if (_dialogResult == DialogResult.OK)
                        {
                            ViewDatabase(sender, e);
                            ClearTextBoxes(sender, e);
                        }
                    }
                }
                conn.Close();
            }
        }

Я хотел, когда пользователь наберет тот же "код продукта", messagebox появится сообщение о том, что введенный "код продукта" не допускается, поскольку он существует в базе данных и не выдает ошибку (завершение работы программы).

Как это исправить?

Спасибо

Ваш ответ будет высоко оценен!

2 3

2 ответа:

Ошибка, которую вы получаете, вполне нормальна. Вы не можете вставлять дубликаты в столбец первичного ключа (и они не могут содержать "NULL"). Дополнительная информация о первичных ключах:

W3schools-первичный ключ

Database.about.com

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

  1. Выполнить выборку в базе данных

    SELECT TOP 1 ProductCode FROM Table WHERE ProductCode = 'this.numericTextBox1.Text'"
    

    Если этот запрос выдает результат, то код продукта уже присутствует в базе данных и запрос должен Не выполняться

  2. Проверьте источник данных вашего datagridview

    В качестве источника данных для вашего datagridview вы, вероятно, предоставляете список / Dataset. Вы можете проверить свой список на наличие вновь введенного кода продукта. Вы можете использовать ссылку здесь или просто повторить источник. (чем бы дитя ни тешилось)

    Если вы можете дать мне тип источника данных, то я может привести пример кода

  3. Проверьте свой Datagridview

    Если ваш datagridview содержит все записи базы данных, то вы можете выполнить итерацию строк и проверить, содержит ли первый столбец код продукта, равный вновь введенному коду продукта.

    Что-то среди строк

     foreach (DataGridViewRow row in dgvDataGridView.Rows)
          {
          if(row.Cells[0].Value.toString().equals(this.numericTextBox1.Text))
    
               { 
    
               // Productcode is already present
               // Throw message/exception Or whatever
               break; 
               }
          }
    

Я бы выбрал вариант 1, так как вы datagridview/datasource не можете показывать / хранить все записи из Table

Перед выполнением INSERT Вы можете проверить, содержит ли база данных уже ProductCode (который, по-видимому, является ключом в вашей таблице).

Что-то вроде (скопировать / вставить код из одного из моих проектов, но должно быть понятно)

 var command = new OleDbCommand("SELECT COUNT(*) FROM results WHERE id = ?", _connection);
 command.Parameters.Add("id", OleDbType.Date).Value = id;
 if ((int)command.ExecuteScalar() == 0)
 {
     // not exists
 }

Предложение: не создавайте AddDatabase обработчик событий, а создайте отдельный класс для обработки операций с базой данных, сделайте там Метод AddDatabase и вызовите его из обработчика событий.

Тогда у вас может быть 2 метода Exists(id) и Add(...), так что в этом случае вы можете сделать простой дубликат проверки:

if(Database.Exists(id))
{
    // show errror
    return;
}
DataBase.Add(...);