В моем проекте имеется кнопка "Добавить запись в 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;
}
}
}
Вы предполагаете, что наличие в таблице 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);
Необходимо заменить
int max = 0;
if (IdCount.ExecuteScalar() != null) max = Convert.ToInt32(IdCount.ExecuteScalar());
на
int max = int.Parse(DataAboutGroups.RowCount.ToString());
где DataAboutGroups - свойство name у DataGridView
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как можно получить список стандартных приложений Windows и занести их в comboBox и запускать, нажав на Button? Возможно,есть какие-то варианты, не прописывая...
Подскажите как создать кнопку (Button) в приложении WPF не используя разметки XAML (прописав этапы ее создания в классе приложения WPF на C#)
Есть такая регулярка которая выбирает все что находится между скобок вместе с ними, у меня никак не получается добавить исключение что бы пропускало...