Добавление записей в таблицу Access при помощи C#

254
02 февраля 2019, 12:10

В моем проекте имеется кнопка "Добавить запись в Access". После того, как я записал все необходимые для добавления данные, я нажимаю на кнопку. После этого возникает данная ошибка, если в таблице Access нет каких либо данных (пустая).

P.S. Код прилагается.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Data.OleDb; 
using System.Drawing; using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms;
namespace Authorization
{
    public partial class fGroup : Form
    {
        OleDbConnection requireConnect = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\BD_Primer1.accdb");
        BindingSource BindnSource;
        DataTable DataTab;
        bool forBtns;
        public fGroup()
        {
            InitializeComponent();
            cbSpecialty.SelectedIndex = 0;
            LoadDataFromAccess();
            forBtns = false;
        }
        void LoadDataFromAccess()
        {
            OleDbDataAdapter adapter = new OleDbDataAdapter("Select * from Groups", requireConnect);
            DataTab = new DataTable();
            adapter.Fill(DataTab);
            BindnSource = new BindingSource();
            BindnSource.DataSource = DataTab;
            bindingNavigator1.BindingSource = BindnSource;
            nCourse.DataBindings.Clear();
            nCourse.DataBindings.Add(new Binding("Text", BindnSource, "course"));
            tbNumberOfGroup.DataBindings.Clear();
            tbNumberOfGroup.DataBindings.Add(new Binding("Text", BindnSource, "numberOfGroup"));
            cbSpecialty.DataBindings.Clear();
            cbSpecialty.DataBindings.Add(new Binding("Text", BindnSource, "specialty"));
            dataAboutGroups.DataSource = BindnSource;
            dataAboutGroups.Columns[0].Visible = false;
            dataAboutGroups.Columns[1].HeaderText = "Курс";
            dataAboutGroups.Columns[2].HeaderText = "Специальность";
            dataAboutGroups.Columns[3].HeaderText = "Номер группы";
            dataAboutGroups.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dataAboutGroups.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dataAboutGroups.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dataAboutGroups.RowsDefaultCellStyle.WrapMode = DataGridViewTriState.True;
        }
        private void ClearText()
        {
            nCourse.Text="1";
            tbNumberOfGroup.Text = "";
            cbSpecialty.SelectedIndex = 0;
        }
        private void addBtn_Click(object sender, EventArgs e)
        {
            ClearText();
            forBtns = true;
            saveBtn.Enabled = false;
        }
        private void tbNumberOfGroup_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != 8) e.Handled = true;
        }
        private void delBtn_Click(object sender, EventArgs e)
        {
            if (forBtns)
            {
                //отмена
                ClearText();
                forBtns = false;
                saveBtn.Enabled = true;
                LoadDataFromAccess();
            }
            else if (BindnSource.Count > 0)
            {
                //удаление
                int rowPosition = BindnSource.Position;
                int delId = Convert.ToInt32(((DataRowView)this.BindnSource.Current).Row["ID_group"]);
                try
                {
                    DialogResult result = MessageBox.Show(
                    "Вы действительно хотите удалить данную запись",
                    "Удаление",
                    MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question,
                    MessageBoxDefaultButton.Button1,
                    MessageBoxOptions.DefaultDesktopOnly);
                    if (result == DialogResult.No)
                    {
                        LoadDataFromAccess();
                        return;
                    }
                    if (result == DialogResult.Yes)
                    {
                        requireConnect.Open();
                        OleDbCommand Delete = new OleDbCommand("Delete From Groups where ID_group = @ID", requireConnect);
                        Delete.Parameters.AddWithValue("@ID", delId);
                        Delete.ExecuteNonQuery();
                    }
                }
                finally
                {
                    requireConnect.Close();
                    LoadDataFromAccess();
                }
            }
        }
        private void saveBtn_Click(object sender, EventArgs e)
        {
            if (forBtns)
            {
                try
                {
                    requireConnect.Close();
                    requireConnect.Open();
                    OleDbCommand IdCount = new OleDbCommand("Select Max(ID_group) from Groups", requireConnect);
                    int max = 0;
                    if (IdCount.ExecuteScalar() != null)  max = Convert.ToInt32(IdCount.ExecuteScalar()); 
                    //добавление новых данных
                    OleDbCommand Insert = new OleDbCommand("INSERT INTO [Groups] VALUES(@ID_group, @course, @specialty, @numberOfGroup)", requireConnect);
                    Insert.Parameters.AddWithValue("@ID_group", max + 1);
                    Insert.Parameters.AddWithValue("@course", nCourse.Text);
                    Insert.Parameters.AddWithValue("@specialty", cbSpecialty.Text);
                    Insert.Parameters.AddWithValue("@numberOfGroup", tbNumberOfGroup.Text);
                    Insert.ExecuteNonQuery();
                    MessageBox.Show(
                    "Запись успешно добавлена",
                    "Сохранение",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Information,
                    MessageBoxDefaultButton.Button1,
                    MessageBoxOptions.DefaultDesktopOnly);
                    forBtns = false;
                    saveBtn.Enabled = true;
                }
                finally
                {
                    requireConnect.Close();
                    LoadDataFromAccess();
                }
            }
            else if (BindnSource.Count > 0)
            {
                //сохранение отредактированных данных
                int position = BindnSource.Position;
                int updateId = Convert.ToInt32(((DataRowView)this.BindnSource.Current).Row["ID_group"]);
                try
                {
                    requireConnect.Close();
                    requireConnect.Open();
                    OleDbCommand Update = new OleDbCommand("UPDATE Groups SET Course=@course, Specialty=@specialty, numberOfGroup=@numberOfGroup WHERE ID_group=@update_ID", requireConnect);
                    Update.Parameters.AddWithValue("@course", nCourse.Text);
                    Update.Parameters.AddWithValue("@specialty", cbSpecialty.Text);
                    Update.Parameters.AddWithValue("@numberOfGroup", tbNumberOfGroup.Text);
                    Update.Parameters.AddWithValue("@update_ID", updateId);
                    Update.ExecuteNonQuery();
                    MessageBox.Show("Запись обновлена");
                }
                finally
                {
                    requireConnect.Close();
                    LoadDataFromAccess();
                    BindnSource.Position = position;
                }
            }
        }
        private void tbNumberOfGroup_TextChanged(object sender, EventArgs e)
        {
            if (this.Text == "") saveBtn.Enabled = false;
            else saveBtn.Enabled = true;
        }
    }
}
Answer 1

Вы предполагаете, что наличие в таблице NULL приведет к получению через ExecuteScalar значения null, но это не так. На самом деле, OLE DB при этом возвращает особое значение DBNull. Также, нет необходимости выполнять запрос два раза. Замените

if (IdCount.ExecuteScalar() != null)  max = Convert.ToInt32(IdCount.ExecuteScalar());

на

object data = IdCount.ExecuteScalar();
if(data != null && data != DBNull.Value) max = Convert.ToInt32(data);
Answer 2

Необходимо заменить

int max = 0;
if (IdCount.ExecuteScalar() != null)  max = Convert.ToInt32(IdCount.ExecuteScalar()); 

на

int max = int.Parse(DataAboutGroups.RowCount.ToString());

где DataAboutGroups - свойство name у DataGridView

READ ALSO
Список стандартных приложений Windows

Список стандартных приложений Windows

Как можно получить список стандартных приложений Windows и занести их в comboBox и запускать, нажав на Button? Возможно,есть какие-то варианты, не прописывая...

179
WPF Button без разметки XAML на C#

WPF Button без разметки XAML на C#

Подскажите как создать кнопку (Button) в приложении WPF не используя разметки XAML (прописав этапы ее создания в классе приложения WPF на C#)

166
Не могу вызвать функцию через SOAP

Не могу вызвать функцию через SOAP

Написали api на 1CСкинули список функций

220
Модифицировать регулярку

Модифицировать регулярку

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

236