Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
tumanovalex
3 / 3 / 1
Регистрация: 09.07.2009
Сообщений: 287
1

Запись данных в базу данных mdb с использованием DataAdapter и DataSet

18.04.2013, 18:53. Просмотров 4399. Ответов 11
Метки нет (Все метки)

Попробовал сделать Update для таблицы контактов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
    private void Form1_Load(object sender, EventArgs e)
    {
      OleDbConnection connection = new OleDbConnection();
      connection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\AdoStudy.mdb";
      try
      {
        connection.Open();
      }
      catch
      {
        MessageBox.Show("Ошибка соединения с базой данных AdoStudy.mdb");
        Application.Exit();
      }
      cmd = connection.CreateCommand();
      cmd.CommandText = "SELECT *FROM Contacts";
      da.SelectCommand = cmd;
      da.FillSchema(myData, SchemaType.Source, "Contacts");
      da.Fill(myData, "Contacts");
      cmd.CommandText = "SELECT *FROM Phone";
      da.SelectCommand = cmd;
      da.FillSchema(myData, SchemaType.Source, "Phone");
      da.Fill(myData, "Phone");
      DataRelation rl = new DataRelation("relat", myData.Tables["Contacts"].Columns["idContact"],
                        myData.Tables["Phone"].Columns["idContact"], true);
      myData.Relations.Add(rl);
      bsParent.DataSource = myData;
      bsParent.DataMember = "Contacts";
      bsChild.DataSource = bsParent;
      bsChild.DataMember = "relat";
      dgvContacts.DataSource = bsParent;
      dgvPhone.DataSource = bsChild; 
      daInsert();
      daUpdate();
      daDelete();
     }
 
    private void testBaseBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
       da.Update(myData.Tables["Contacts"]);
    }
 
    private void daInsert()
    {
      cmd.CommandText = "INSERT INTO Contacts " +
                        " (idContact, Person, Birthday, YearBirthday) VALUES " + 
                        " (@idContact, @Person, @Birthday, @YearBirthday)";
      da.InsertCommand = cmd;
      pc = da.InsertCommand.Parameters;
      pc.Add("@idContact", OleDbType.Integer, 0, "idContact");
      pc.Add("@Person", OleDbType.VarChar, 0, "Person");
      pc.Add("@Birthday", OleDbType.DBDate, 0, "Birthday");
      pc.Add("@YearBirthday", OleDbType.Integer, 0, "YearBirthday");
    }
 
    private void daUpdate()
    {
      cmd.CommandText = "UPDATE Contacts " +
                        " SET idContact = @idContact_New, Person = @Person_New, " + 
                        " Birthday = @Birthday_New, YearBirthday = @YearBirthday_New " + 
                        " WHERE idContact = @idContact_Old AND Person = @Person_Old AND " + 
                               " Birthday = @Birthday_Old AND YearBirthday = @YearBirthday_Old";
      da.UpdateCommand = cmd;
      pc = da.UpdateCommand.Parameters;
      pc.Add("@idContact_New", OleDbType.Integer, 0, "idContact");
      pc.Add("@Person_New", OleDbType.VarChar, 0, "Person");
      pc.Add("@Birthday_New", OleDbType.DBDate, 0, "Birthday");
      pc.Add("@YearBirthday_New", OleDbType.Integer, 0, "YearBirthday");
      p = pc.Add("@idContact_Old", OleDbType.Integer, 0, "idContact");
      p.SourceVersion = DataRowVersion.Original;
      p = pc.Add("@Person_Old", OleDbType.VarChar, 0, "Person");
      p.SourceVersion = DataRowVersion.Original;
      p = pc.Add("@Birthday_Old", OleDbType.DBDate, 0, "Birthday");
      p.SourceVersion = DataRowVersion.Original;
      p = pc.Add("@YearBirthday_Old", OleDbType.Integer, 0, "YearBirthday");
    }
 
    private void daDelete()
    {
      cmd.CommandText = "DELETE FROM Contacts " +
                        " WHERE idContact = @idContact AND Person = @Person AND " +
                               " Birthday = @Birthday AND YearBirthday = @YearBirthday";
      da.DeleteCommand = cmd;
      pc = da.DeleteCommand.Parameters;
      p = pc.Add("@idContact", OleDbType.Integer, 0, "idContact");
      p.SourceVersion = DataRowVersion.Original;
      p = pc.Add("@Person", OleDbType.VarChar, 0, "Person");
      p.SourceVersion = DataRowVersion.Original;
      p = pc.Add("@Birthday", OleDbType.DBDate, 0, "Birthday");
      p.SourceVersion = DataRowVersion.Original;
      p = pc.Add("@YearBirthday", OleDbType.Integer, 0, "YearBirthday");
      p.SourceVersion = DataRowVersion.Original;
    }
При попытке сохранить данные сообщений об ошибке не появляется, но и данные в базу mdb не вносятся. Подскажите, пожалуйста, в чем ошибка.
0
Вложения
Тип файла: zip AdoStudy.zip (29.7 Кб, 30 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2013, 18:53
Ответы с готовыми решениями:

Запись в базу данных MDB 1000 записей в секунду
Коллеги, добрый день! Я работаю с биржевыми данными. Мне нужно записывать значения цен акций в...

Как вы делаете Update данных в БД (при использовании DataGridView, DataSet, DataAdapter)
Доброго дня, форумчане. Отдельный привет знакомым форумчанам. Решил поднять я старую наболевшую...

Запись данных в БД через dataAdapter
Подскажите пожалуйста почему данные в таблице есть, а в базе нет? private void...

Сохранение данных с DataSet в базу данных
Здраствуйте. У меня есть датагрид который подвязан к таблице в базе. Мне нужно что бы при клике на...

Пакетная передача обновлений (Insert) в базу данных посредством DataAdapter.Update
Здравствуйте, господа :yes: Кто-нибудь имел дело с пакетной передачей обновлений (а конкретно...

11
kodv
1432 / 1105 / 344
Регистрация: 11.04.2011
Сообщений: 2,610
Завершенные тесты: 1
20.04.2013, 05:58 2
Ошибка в вашем подходе к программированию. Прежде, чем пользоваться методами и свойствами какой-нибудь класса, нужно знать, как они работает. Если не знаете, то читайте, допустим, в MSDN:
Поставщик OLE DB.NET не поддерживает именованные параметры для передачи параметров в оператор SQL или хранимую процедуру, вызываемую OleDbCommand, если CommandType установлен в значение Text. В этом случае в качестве заполнителя необходимо использовать вопросительный знак (?). Например:

SELECT * FROM Customers WHERE CustomerID = ?

Поэтому порядок, в котором объекты OleDbParameter добавляются в коллекцию OleDbParameterCollection, должен соответствовать позиции заместителя (знака вопроса) для данного параметра.
2
tumanovalex
3 / 3 / 1
Регистрация: 09.07.2009
Сообщений: 287
20.04.2013, 09:43  [ТС] 3
Цитата Сообщение от kodv Посмотреть сообщение
Ошибка в вашем подходе к программированию. Прежде, чем пользоваться методами и свойствами какой-нибудь класса, нужно знать, как они работает. Если не знаете, то читайте, допустим, в MSDN:
Справедливое замечание. Спасибо.
0
tumanovalex
3 / 3 / 1
Регистрация: 09.07.2009
Сообщений: 287
20.04.2013, 12:38  [ТС] 4
Упростил базу mdb. Попробовал сделать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private void daUpdate()
{
  string strIns = "INSERT INTO tbl1(id, txt, dt, num) VALUES(?, ?, ?, ?)";
  // insert
  OleDbCommand insertCmd = new OleDbCommand(strIns, con);
  da.InsertCommand = insertCmd;
  insertCmd.Parameters.Add("@id", OleDbType.Integer);
  insertCmd.Parameters.Add("@txt", OleDbType.VarChar);
  insertCmd.Parameters.Add("@dt", OleDbType.DBDate);
  insertCmd.Parameters.Add("@num", OleDbType.Integer);
  // update
  string strUpd = "UPDATE tbl1 SET id = ?, txt = ?, dt = ?, num = ?";
  OleDbCommand updateCmd = new OleDbCommand(strUpd, con);
  da.UpdateCommand = updateCmd;
  updateCmd.Parameters.Add("@id", OleDbType.Integer);
  updateCmd.Parameters.Add("@txt", OleDbType.VarChar);
  updateCmd.Parameters.Add("@dt", OleDbType.DBDate);
  updateCmd.Parameters.Add("@num", OleDbType.Integer);
  // delete
  string strDel = "DELETE FROM tbl1 WHERE id = ? AND txt = ? AND dt = ? AND num = ?";
  OleDbCommand deleteCmd = new OleDbCommand(strDel, con);
  da.DeleteCommand = deleteCmd;
  deleteCmd.Parameters.Add("@id", OleDbType.Integer);
  deleteCmd.Parameters.Add("@txt", OleDbType.VarChar);
  deleteCmd.Parameters.Add("@dt", OleDbType.DBDate);
  deleteCmd.Parameters.Add("@num", OleDbType.Integer);
}
 
private void bindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
  da.Update(ds.Tables[0]);
}
В базу ничего не записывается. Никак не пойму, как нужно задавать правильно параметры команд и как DataAdapter определяет нужные строки для добавления, удаления, обновления. Как он определяет конкретные значения подставляемых параметров? Упрощенный проект прикрепил
0
Вложения
Тип файла: zip AdoNet.zip (29.3 Кб, 11 просмотров)
20.04.2013, 12:38
wm_leviathan
199 / 200 / 70
Регистрация: 12.01.2011
Сообщений: 699
Завершенные тесты: 2
20.04.2013, 13:06 5
C#
1
da.SelectCommand.ExecuteNonQuery();
как пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
string queryStringSave = "Insert into Family (Kodind,Kodf,Fam,Ima,Ot,Dr,Otn,Namepasp,Serpasp,Nompasp,Dvidpasp,Kemvidpasp," +
            "Mestrab,DateKonecRab,Projiv,Primech,Subs) values (@Kodind,@Kodf,@Fam,@Ima,@Ot,@Dr,@Otn,@Namepasp,@Serpasp,@Nompasp," +
            "@Dvidpasp,@Kemvidpasp,@Mestrab,@DateKonecRab,@Projiv,@Primech,@Subs)";
 using (SqlConnection connection = new SqlConnection(conn.connectionString))
                        {
                            SqlDataAdapter dataAdapter = new SqlDataAdapter(queryStringSave, connection);
                            dataAdapter.SelectCommand.Parameters.Add("@Kodind", SqlDbType.Int).Value = Kodind;
                            dataAdapter.SelectCommand.Parameters.Add("@Kodf", SqlDbType.Int).Value = Kodfamily;
                            dataAdapter.SelectCommand.Parameters.Add("@Fam", SqlDbType.NVarChar).Value = ((frmIndCard)Application.OpenForms["frmIndCard"]).txtFamFamily.Text;
                            dataAdapter.SelectCommand.Parameters.Add("@Ima", SqlDbType.NVarChar).Value = ((frmIndCard)Application.OpenForms["frmIndCard"]).txtImaFamily.Text;
                            dataAdapter.SelectCommand.Parameters.Add("@Ot", SqlDbType.NVarChar).Value = ((frmIndCard)Application.OpenForms["frmIndCard"]).txtOtFamily.Text;
                            dataAdapter.SelectCommand.Parameters.Add("@Dr", SqlDbType.SmallDateTime).Value = ((frmIndCard)Application.OpenForms["frmIndCard"]).dtpDrFamily.Text;
                            dataAdapter.SelectCommand.Parameters.Add("@Otn", SqlDbType.Int).Value = ((frmIndCard)Application.OpenForms["frmIndCard"]).cbOtnosh.SelectedIndex + 1;
                            dataAdapter.SelectCommand.Parameters.Add("@Namepasp", SqlDbType.NVarChar).Value = ((frmIndCard)Application.OpenForms["frmIndCard"]).cbDocFamily.Text;
                            dataAdapter.SelectCommand.Parameters.Add("@Serpasp", SqlDbType.NVarChar).Value = ((frmIndCard)Application.OpenForms["frmIndCard"]).txtSeriaDocFamily.Text;
                            dataAdapter.SelectCommand.Parameters.Add("@Nompasp", SqlDbType.NVarChar).Value = ((frmIndCard)Application.OpenForms["frmIndCard"]).txtNomerDocFamily.Text;
                            dataAdapter.SelectCommand.Parameters.Add("@Dvidpasp", SqlDbType.SmallDateTime).Value = DvidDocFamily ?? DBNull.Value;
                            dataAdapter.SelectCommand.Parameters.Add("@Kemvidpasp", SqlDbType.NVarChar).Value = ((frmIndCard)Application.OpenForms["frmIndCard"]).cbKemVidDocFamily.Text;
                            dataAdapter.SelectCommand.Parameters.Add("@Mestrab", SqlDbType.NVarChar).Value = ((frmIndCard)Application.OpenForms["frmIndCard"]).txtMestRab.Text;
                            dataAdapter.SelectCommand.Parameters.Add("@DateKonecRab", SqlDbType.SmallDateTime).Value = DateKonecRab ?? DBNull.Value;;
                            dataAdapter.SelectCommand.Parameters.Add("@Projiv", SqlDbType.NVarChar).Value = ((frmIndCard)Application.OpenForms["frmIndCard"]).cbProjivFamily.Text;
                            dataAdapter.SelectCommand.Parameters.Add("@Primech", SqlDbType.NVarChar).Value = ((frmIndCard)Application.OpenForms["frmIndCard"]).txtPrimechFamily.Text;
                            dataAdapter.SelectCommand.Parameters.Add("@Subs", SqlDbType.Bit).Value = false;
                            connection.Open();
                            dataAdapter.SelectCommand.ExecuteNonQuery();
                            connection.Close();
0
tumanovalex
3 / 3 / 1
Регистрация: 09.07.2009
Сообщений: 287
20.04.2013, 16:38  [ТС] 6
Наконец-то получилось вставить данные в базу:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
private void bindingNavigatorSaveItem_Click(object sender, EventArgs e
{
  OleDbParameter p;
  // insert
  string strIns = "INSERT INTO tbl1(id, txt) VALUES (?, ?)";
  OleDbCommand insertCmd = new OleDbCommand(strIns, con);
  da.InsertCommand = insertCmd;
  p = new OleDbParameter("@id", OleDbType.Integer);
  p.SourceColumn = "id";
  p.SourceVersion = DataRowVersion.Original;
  insertCmd.Parameters.Add(p);
  p = new OleDbParameter("@txt", OleDbType.VarChar);
  p.SourceColumn = "txt";
  p.SourceVersion = DataRowVersion.Original;
  insertCmd.Parameters.Add(p);
 // update
  string strUpd = "UPDATE tbl1 SET id = ?, txt = ?";
   //string strUpd = "UPDATE tbl1 SET txt = ?";
  OleDbCommand updateCmd = new OleDbCommand(strUpd, con);
  da.UpdateCommand = updateCmd;
  p = new OleDbParameter("@id", OleDbType.Integer);
  p.SourceColumn = "id";
  p.SourceVersion = DataRowVersion.Original;
  updateCmd.Parameters.Add(p);
  p = new OleDbParameter("@txt", OleDbType.VarChar);
  p.SourceColumn = "txt";
  p.SourceVersion = DataRowVersion.Original;
  updateCmd.Parameters.Add(p);
  // delete
  string strDel = "DELETE FROM tbl1 WHERE id = ? AND txt = ?";
  OleDbCommand deleteCmd = new OleDbCommand(strDel, con);
  da.DeleteCommand = deleteCmd;
  p = new OleDbParameter("@id", OleDbType.Integer);
  p.SourceColumn = "id";
  p.SourceVersion = DataRowVersion.Original;
  deleteCmd.Parameters.Add(p);
  p = new OleDbParameter("@txt", OleDbType.VarChar);
  p.SourceColumn = "txt";
  p.SourceVersion = DataRowVersion.Original;
  deleteCmd.Parameters.Add(p);
  da.Update(ds.Tables[0]);
}]
Но не получается update. При изменении поля txt и попытке записи получаю "Невозможно обновить поле 'id'; не обновляемое поле". Подскажите, пожалуйста, исправить эту ошибку. Проект прикрепляю
0
Вложения
Тип файла: zip AdoNet2.zip (29.3 Кб, 17 просмотров)
kodv
1432 / 1105 / 344
Регистрация: 11.04.2011
Сообщений: 2,610
Завершенные тесты: 1
20.04.2013, 19:03 7
Цитата Сообщение от tumanovalex Посмотреть сообщение
Невозможно обновить поле 'id'; не обновляемое поле
У вас поле id имеет тип Счётчик. Поля данного типа нельзя обновлять. Хотя в поля данного типа значения тоже вставлять нельзя, но у вас как то это получается ... В общем, ошибка возникает из-за того, что вы пытаетесь обновить поле типа Счётчик.

У вас же в первом посте были написаны замечательные запросы, только для SqlCommand, а не для OleDbCommand. Что с ними случилось в дальнейшем? Особенно с UPDATE.
T-SQL
1
UPDATE tbl1 SET id = ?, txt = ?
Синтаксически, ваш запрос верный. Вот только каждый раз будет обновляться вся таблица, а не конкретная строка, так как, по сравнению с первым постом, куда то исчезла секция WHERE. Про поле-счетчик id уже написано выше. Думаю, запрос должен выглядеть примерно так:
T-SQL
1
UPDATE tbl1 SET txt = ? WHERE id = ?
.
1
tumanovalex
3 / 3 / 1
Регистрация: 09.07.2009
Сообщений: 287
20.04.2013, 20:39  [ТС] 8
Спасибо за подсказку, получилось так:
C#
1
2
3
4
5
6
7
8
9
10
11
string strUpd = "UPDATE tbl1 SET txt = ? WHERE id = ?"; 
OleDbCommand updateCmd = new OleDbCommand(strUpd, con);
da.UpdateCommand = updateCmd;
p = new OleDbParameter("@txt", OleDbType.VarChar);
p.SourceColumn = "txt";
p.SourceVersion = DataRowVersion.Current;
updateCmd.Parameters.Add(p);
p = new OleDbParameter("@id", OleDbType.Integer);
p.SourceColumn = "id";
p.SourceVersion = DataRowVersion.Original;
updateCmd.Parameters.Add(p);
Возник новый вопрос: почему у меня на навигаторе неактивны все иконки, кроме добавления и записи? Видимость везде установлена в истину.
0
kodv
1432 / 1105 / 344
Регистрация: 11.04.2011
Сообщений: 2,610
Завершенные тесты: 1
21.04.2013, 06:10 9
Цитата Сообщение от tumanovalex Посмотреть сообщение
у меня на навигаторе неактивны все иконки, кроме добавления и записи?
Если набор данных, к которому привязан навигатор, пустой, то да.
0
tumanovalex
3 / 3 / 1
Регистрация: 09.07.2009
Сообщений: 287
21.04.2013, 12:02  [ТС] 10
Попробовал сделать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
private void setBsnav()
{
  bs = new BindingSource();
  bs.DataSource = ds.Tables[0];
  bsnav.BindingSource = bs;
}
 
private void bindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
  da.Update(ds.Tables[0]);
}
 
private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
{
  da.Update(ds.Tables[0]);
}
 
private void bindingNavigatorMoveNextItem_Click(object sender, EventArgs e)
{
  bs.MoveNext();
}
 
private void bindingNavigatorMovePreviousItem_Click(object sender, EventArgs e)
{
  bs.MovePrevious();
 
}
 
private void bindingNavigatorMoveFirstItem_Click(object sender, EventArgs e)
{
  bs.MoveFirst();
}
 
private void bindingNavigatorMoveLastItem_Click(object sender, EventArgs e)
{
  bs.MoveLast();
}
При удалении почему-то удаляется только первая строка, а не текущая. А перемещение по записям в DataGridView вообще не происходит. Подскажите, пожалуйста, как сделать правильно. Новый проект прилагаю
0
Вложения
Тип файла: zip AdoNet.zip (29.5 Кб, 17 просмотров)
kodv
1432 / 1105 / 344
Регистрация: 11.04.2011
Сообщений: 2,610
Завершенные тесты: 1
22.04.2013, 04:41 11
tumanovalex, Удаляется текущая строка. Просто у вас для навигации по DataGridView и для BindingNavigator'а используются разные объекты. Перемещение по DataGridView не отражается в BindingSource, который вы привязали к BindingNavigator, и наоборот. Удаляется та строка, которая является текущей для BindingNavigator'а. Привяжите и к DataGridView, и к BindingNavigator'у один и тот же BindingSource, и вы почувствуете разницу. Не забудьте после этого поудалять лишний код, которым вы обрабатываете кнопки BindingNavigator'а.
0
tumanovalex
3 / 3 / 1
Регистрация: 09.07.2009
Сообщений: 287
24.04.2013, 19:54  [ТС] 12
Наверное, я Вас неправильно понял. Сделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
namespace ADOnet
{
  public partial class Form1 : Form
  {
 
    private DataSet ds;
    private OleDbDataAdapter da;
    OleDbCommand cmd;
    OleDbConnection con;
    OleDbParameter p;
    BindingSource bs;
 
    public Form1()
    {
      InitializeComponent();
    }
 
    private void Form1_Load(object sender, EventArgs e)
    {
      openDb();
      ds = new DataSet();
      ds.Tables.Add("tbl1ds");
      da = new OleDbDataAdapter();
      cmd = con.CreateCommand();
      cmd.CommandText = "SELECT *FROM tbl1";
      da.SelectCommand = cmd;
      da.FillSchema(ds, SchemaType.Source, "tbl1ds");
      da.Fill(ds, "tbl1ds");
      cmd.CommandText = "SELECT *FROM tbl2";
      da.SelectCommand = cmd;
      da.FillSchema(ds, SchemaType.Source, "tbl2ds");
      bs = new BindingSource();
      bs.DataSource = ds.Tables[0];
      bsnav.BindingSource = bs;
      dgv1.DataSource = bs;
      daInsert();
      daUpdate();
      daDelete();
    }
 
    private void daInsert()
    {
      string strIns = "INSERT INTO tbl1(id, txt) VALUES (?, ?)";
      OleDbCommand insertCmd = new OleDbCommand(strIns, con);
      da.InsertCommand = insertCmd;
      p = new OleDbParameter("@id", OleDbType.Integer);
      p.SourceColumn = "id";
      p.SourceVersion = DataRowVersion.Original;
      insertCmd.Parameters.Add(p);
      p = new OleDbParameter("@txt", OleDbType.VarChar);
      p.SourceColumn = "txt";
      p.SourceVersion = DataRowVersion.Original;
      insertCmd.Parameters.Add(p);
    }
 
    private void daUpdate()
    {
      string strUpd = "UPDATE tbl1 SET txt = ? WHERE id = ?"; 
      OleDbCommand updateCmd = new OleDbCommand(strUpd, con);
      da.UpdateCommand = updateCmd;
      p = new OleDbParameter("@txt", OleDbType.VarChar);
      p.SourceColumn = "txt";
      p.SourceVersion = DataRowVersion.Current;
      updateCmd.Parameters.Add(p);
      p = new OleDbParameter("@id", OleDbType.Integer);
      p.SourceColumn = "id";
      p.SourceVersion = DataRowVersion.Original;
      updateCmd.Parameters.Add(p);
    }
 
    private void daDelete()
    {
      string strDel = "DELETE FROM tbl1 WHERE id = ? AND txt = ?";
      OleDbCommand deleteCmd = new OleDbCommand(strDel, con);
      da.DeleteCommand = deleteCmd;
      p = new OleDbParameter("@id", OleDbType.Integer);
      p.SourceColumn = "id";
      p.SourceVersion = DataRowVersion.Current;
      deleteCmd.Parameters.Add(p);
      p = new OleDbParameter("@txt", OleDbType.VarChar);
      p.SourceColumn = "txt";
      p.SourceVersion = DataRowVersion.Current;
      deleteCmd.Parameters.Add(p);
    }
 
    private void openDb()
    {
      con = new OleDbConnection();
      con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\Adonet.mdb";
      try
      {
        con.Open();
      }
      catch
      {
        MessageBox.Show("Ошибка соединения с базой данных AdoStudy.mdb");
        Application.Exit();
      }
    }
 
    private void bindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
      da.Update(ds.Tables[0]);
    }
 
    private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
    {
      DataRowView dr = (DataRowView) bs.Current;
      dr.Delete();
    }
 
    private void bindingNavigatorMoveNextItem_Click(object sender, EventArgs e)
    {
      bs.MoveNext();
    }
 
    private void bindingNavigatorMovePreviousItem_Click(object sender, EventArgs e)
    {
      bs.MovePrevious();
 
    }
 
    private void bindingNavigatorMoveFirstItem_Click(object sender, EventArgs e)
    {
      bs.MoveFirst();
    }
 
    private void bindingNavigatorMoveLastItem_Click(object sender, EventArgs e)
    {
      bs.MoveLast();
    }
 
    private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
    {
      bs.AddNew();
    }
  }
}
В результате:
- при перемещении выделяется не следующая строка, а через одну;
- при удалении удаляется текущая и следующая за ней строки;
- правильно работает только добавление записи и переход вначало/конец записей.
Подскажите, пожалуйста, что я сделал неправильно. Код проекта прилагаю.
0
Вложения
Тип файла: zip AdoNet2.zip (29.7 Кб, 22 просмотров)
24.04.2013, 19:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2013, 19:54

Не удается обновить базу данных (.mdb) в C#
При работе с программой не могу обновить данные в базе данных (*.mdb): connectionString =...

Вставить данные из DataSet в базу данных
Здравствуйте. DataSet содержит большую(около 5 тыс. записей) таблицу с данными, полученную из xml...

Создать базу данных используя dataset
Help! Требуется создать базу данных в C# с помощью dataset. Можете объяснить как это делается? У...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru