Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.117.133.115] |
|
Сообщ.
#1
,
|
|
|
Сделал тестовую программу, в которой вроде бы изменении данных в DataGridView должны изменяться данных в базе данных:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.OleDb; namespace Reminder { public partial class Form1 : Form { private OleDbConnection con; private DataSet ds; private OleDbDataAdapter da1; private OleDbCommand cmd; private OleDbParameter p; private BindingSource bs; public void fillDB(String strTableName, String strDsTable, OleDbDataAdapter da, DataGridView dgv, BindingNavigator bn) { cmd = con.CreateCommand(); cmd.CommandText = "SELECT * FROM " + strTableName; da.SelectCommand = cmd; da.Fill(ds, strDsTable); bs = new BindingSource(); bs.DataSource = ds.Tables[strDsTable]; bn.BindingSource = bs; dgv.DataSource = bs; } public void updateDB(String strTableName, OleDbDataAdapter da) { String strUpd = "UPDATE " + strTableName + " SET " + "surname = @surname, " + "firstname = @firstname, " + "birthdate = @birthdate, " + "byear = @byear " + "WHERE id_contact = @id_contact"; cmd = con.CreateCommand(); cmd.CommandText = strUpd; p = cmd.Parameters.Add("@id_contact", OleDbType.BigInt, 5, "id_contact"); p.SourceVersion = DataRowVersion.Original; p = cmd.Parameters.Add("@surname", OleDbType.Char, 40, "surname"); p.SourceVersion = DataRowVersion.Original; p = cmd.Parameters.Add("@firstname", OleDbType.Char, 40, "firstname"); p.SourceVersion = DataRowVersion.Original; p = cmd.Parameters.Add("@birthdate", OleDbType.Date, 20, "birthdate"); p.SourceVersion = DataRowVersion.Original; p = cmd.Parameters.Add("@byear", OleDbType.Integer, 6, "byear"); p.SourceVersion = DataRowVersion.Original; da.UpdateCommand = cmd; } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\Reminder.mdb"); try { con.Open(); } catch { MessageBox.Show("Ошибка соединения с базой данных DBtest.mdb","Ошибка подключения к базе", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); } da1 = new OleDbDataAdapter(); ds = new DataSet(); fillDB("Contact", "tblContact", da1, dataGridView1, binNav1); updateDB("Contact", da1); dataGridView1.Columns[0].HeaderText = "Номер"; dataGridView1.Columns[1].HeaderText = "Фамилия"; dataGridView1.Columns[2].HeaderText = "Имя, отчество"; dataGridView1.Columns[3].HeaderText = "День рождения"; dataGridView1.Columns[4].HeaderText = "Год рождения"; dataGridView1.Sort(dataGridView1.Columns[0], System.ComponentModel.ListSortDirection.Ascending); } private void toolStripButton1_Click(object sender, EventArgs e) // Кнопка на панели Binding Navigator { da1.Update(ds.Tables[0]); } } } Необработанное исключение типа "System.Data.OleDb.OleDbException" произошло в System.Data.dll Дополнительные сведения: Отсутствует значение для одного или нескольких требуемых параметров. Вроде бы все параметры заданы. Подскажите, пожалуйста: 1. Почему возникает ошибка при записи изменений? Вроде бы параметры для обновления я задаю. 2. Как правильно отлаживать приложения, работающие с базами данных? В частности, как в моем примере локализовать ошибку? Прикреплённый файлReminder.zip (31,47 Кбайт, скачиваний: 522) |
Сообщ.
#2
,
|
|
|
Я попробовал изменить программу в соответствии с книгой "Программирование ADO.NET", автор Сеппа, 2007 год:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.OleDb; namespace Reminder { public partial class Form1 : Form { private OleDbConnection con; private DataSet ds; private OleDbDataAdapter da1; private OleDbCommand cmd; private OleDbParameter p; private OleDbParameterCollection pc; private BindingSource bs; public void fillDB(String strTableName, String strDsTable, OleDbDataAdapter da, DataGridView dgv, BindingNavigator bn) { cmd = con.CreateCommand(); cmd.CommandText = "SELECT * FROM " + strTableName; da.SelectCommand = cmd; da.Fill(ds, strDsTable); bs = new BindingSource(); bs.DataSource = ds.Tables[strDsTable]; bn.BindingSource = bs; dgv.DataSource = bs; } public void updateDB(String strTableName, OleDbDataAdapter da) { String strUpd = "UPDATE " + strTableName + " SET " + "id_contact = @id_contact_new, " + "surname = @surname_new, firstname = @firstname_new, birthdate = @birthdate_new, byear = @byear_new " + "WHERE " + "id_contact = @id_contact_old AND " + "surname = @surname_old AND firstname = @firstname_old AND birthdate = @birthdate_old AND byear = @byear_old;"; da.UpdateCommand = new OleDbCommand(strUpd, con); pc = da.UpdateCommand.Parameters; pc.Add("@id_contact_new", OleDbType.BigInt, 0, "id_contact"); pc.Add("@surname_new", OleDbType.Char, 0, "surname"); pc.Add("@firstname_new", OleDbType.Char, 0, "firstname"); pc.Add("@birthdate_new", OleDbType.Date, 0, "birthdate"); pc.Add("@byear_new", OleDbType.Integer, 0, "byear"); p = pc.Add("@id_contact_old", OleDbType.BigInt, 0, "id_contact"); p.SourceVersion = DataRowVersion.Original; p = pc.Add("@surname_old", OleDbType.Char, 0, "surname"); p.SourceVersion = DataRowVersion.Original; p = pc.Add("@firstname_old", OleDbType.Char, 0, "firstname"); p.SourceVersion = DataRowVersion.Original; p = pc.Add("@birthdate_old", OleDbType.Date, 0, "birthdate"); p.SourceVersion = DataRowVersion.Original; p = pc.Add("@byear_old", OleDbType.Integer, 0, "byear"); p.SourceVersion = DataRowVersion.Original; } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\Reminder.mdb"); try { con.Open(); } catch { MessageBox.Show("Ошибка соединения с базой данных DBtest.mdb","Ошибка подключения к базе", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); } da1 = new OleDbDataAdapter(); ds = new DataSet(); fillDB("Contact", "tblContact", da1, dataGridView1, binNav1); updateDB("Contact", da1); dataGridView1.Columns[0].HeaderText = "Номер"; dataGridView1.Columns[1].HeaderText = "Фамилия"; dataGridView1.Columns[2].HeaderText = "Имя, отчество"; dataGridView1.Columns[3].HeaderText = "День рождения"; dataGridView1.Columns[4].HeaderText = "Год рождения"; dataGridView1.Sort(dataGridView1.Columns[0], System.ComponentModel.ListSortDirection.Ascending); } private void toolStripButton1_Click(object sender, EventArgs e) { da1.Update(ds.Tables[0]); } } } |
Сообщ.
#3
,
|
|
|
У Вас в базе поле byrthday, а в тексте Вы используете byrthdate. Я немного исправил Вашу программу, вроде бы вставка, изменение и удаление работают.
Для меня непонятным осталось следующее: если при редактировании или добавлении выделение остается на редактируемой (новой) строке, то редактирование (вставка новой строки) не происходит. Если нажать Enter или выделить элемент другой строки, то все запоминается в базе данных. Как сделать так, чтобы при нажатии кнопки на Навигаторе даже без нажатия Enter или выделении элемента другой строки изменения в базе данных происходили? Прикреплённый файлReminderTest.zip (35,42 Кбайт, скачиваний: 535) |