Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
1

Работа с базой данных Access через ADO.NET

21.11.2016, 12:06. Просмотров 1089. Ответов 7
Метки нет (Все метки)

Учусь работать с базой данных Access через ADO.NET. Попробовал поработать с помощью мастеров - не понравилось, очень много непонятного кода, если где-то будет ошибка, то мне разобраться будет трудно. Без помощи мастеров удалось связать две таблицы. Затем я стал пытаться написать код для изменения данных в первой таблице:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void daContactsIns()
{
// Вставка
  cmd = new OleDbCommand("INSERT INTO tblContact(ID, Famil, IO, Old, BD, Pol, Memo) VALUES(?, ?, ?, ?, ?, ?, ?)", cn);
  cmd.Parameters.Add("ID", OleDbType.BigInt);
  cmd.Parameters.Add("Famil", OleDbType.Char);
  cmd.Parameters.Add("IO", OleDbType.Char);
  cmd.Parameters.Add("Old", OleDbType.TinyInt);
  cmd.Parameters.Add("BD", OleDbType.DBDate);
  cmd.Parameters.Add("Pol", OleDbType.Boolean);
  cmd.Parameters.Add("Memo", OleDbType.LongVarChar);
  daContact.InsertCommand = cmd;
}
При выполнении обновления daContact.Update(ds.Tables[0]); получаю ошибку систаксиса Insert Into. В связи с этим возникли следующие вопросы:
1. Как локализовать ошибку (в каком элементе инструкции ошибка, какие параметры заданы неверно)?
2. Как перехватить ошибку при добавлении, вывести диагностические данные и закрыть соединение с базой?
Проект прикрепил.
0
Вложения
Тип файла: zip ContactsForum.zip (34.1 Кб, 6 просмотров)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2016, 12:06
Ответы с готовыми решениями:

Что лучше: работа с Access через ADO.NET или силами самого Access?
Считаю, что лучше работать с регулярно поступающим в Access объемом данных, разработав приложение...

C#, ADO.NET. Как защитить файл базы данных Access от удаления пользователем через проводник?
VS 2010, framework 4. Добавляю в проект ссылку "Microsoft ADO Ext. 2.8 for DDL and Security"....

Работа с базой данных Access
Доброго времени суток. Есть база данных созданная в Access. Она подключена к проекту. Существует...

Работа с access базой данных
Добрый день, совсем начинающий в работе с базами данных не помучается сделать два вопроса. Смысл...

Подключение к базе данных MS Access через ADO
Добрый вечер! У меня следующий вопрос - почему, когда пытаюсь подключиться к БД через ADO...

7
Usaga
Эксперт .NET
5706 / 3940 / 702
Регистрация: 21.01.2016
Сообщений: 15,508
Завершенные тесты: 2
21.11.2016, 14:32 2
tuchin, ты не задал значения параметров.

Текст с сообщением об ошибке и, возможно, подробностями можно увидеть в теле исключения, которое генерируется в момент неудачной записи в БД.
0
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
21.11.2016, 14:56  [ТС] 3
Так значения, как я понял, должны задаваться при добавлении строки в таблице. Так, например, в пятой строке я ввожу нужные мне данные и вроде бы они должны подставляться вместо вопросов. Как сделать, чтобы это было именно так?
0
Даценд
Модератор
Эксперт .NET
4684 / 4182 / 2747
Регистрация: 20.04.2015
Сообщений: 7,593
21.11.2016, 15:04 4
tuchin,
C#
5
cmd.Parameters.Add("@ID", OleDbType.BigInt).Value = 467678;
или
C#
5
cmd.Parameters.AddWithValue("@ID", 467678);
0
21.11.2016, 15:04
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
21.11.2016, 15:08  [ТС] 5
А как сделать так, чтобы идентификатор автоматически увеличивался на 1, а вместо параметров подставлялись данные, введенные в новой строке таблицы, а не фиксированные данные?
0
Даценд
Модератор
Эксперт .NET
4684 / 4182 / 2747
Регистрация: 20.04.2015
Сообщений: 7,593
21.11.2016, 15:19 6
Лучший ответ Сообщение было отмечено tuchin как решение

Решение

Цитата Сообщение от tuchin Посмотреть сообщение
А как сделать так, чтобы идентификатор автоматически увеличивался на 1
Поле в БД сделайте типом счетчик. При добавлении новой записи значение будет формироваться автоматически, в запросе создавать параметр для поля-счетчика и передавать значение для такого поля в запрос не нужно.
Цитата Сообщение от tuchin Посмотреть сообщение
а вместо параметров подставлялись данные, введенные в новой строке таблицы, а не фиксированные данные?
Вот тут не понял.
Предположу, что данные куда-то вводятся, например в текстбоксы. В этом случае:
C#
1
2
cmd.Parameters.Add("@Famil", OleDbType.Char).Value = tbFamil.Text;
cmd.Parameters.Add("@IO", OleDbType.Char).Value = tbIO.Text;
Ну и т.д. tbFamil и tbIO - текстбоксы, в которые вводятся значения полей Famil и IO.
1
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
21.11.2016, 18:43  [ТС] 7
Чтобы хоть что-то стало получаться, упростил базу до двух полей: ID и Famil. В команде добавления для второго параметра базы данных Famil указал:
C#
1
 cmd.Parameters.Add("@Famil", OleDbType.Char).Value = dataGridView1.CurrentRow.Cells[1].Value;
теперь добавляется только предыдущая строка, а не та, на которой треугольник со звездочкой (видимо, она и считается текущей). А как сделать так, чтобы можно было бы ввести несколько новых строк в DataGridView, а потом их записать все за одно нажатие кнопки? Ведь тогда будет много значений одного и того же параметра, как в команде вставки это отразить?
0
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
22.11.2016, 10:43  [ТС] 8
Попробовал сделать так:
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
namespace ContactsTest
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }
 
    private OleDbConnection cn;
    private DataSet ds = new DataSet();
    private BindingSource bsMain = new BindingSource();
    private BindingSource bsChild = new BindingSource();
    private OleDbDataAdapter daContact;
    private OleDbDataAdapter daPhone;
    private OleDbCommand cmd;
 
 
    private void DBcon(String DBname)
    {
      cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\\" + DBname);
      try
      {
        cn.Open();
      }
      catch
      {
        MessageBox.Show("Ошибка соединения с базой данных " + """ + DBname + """, "Ошибка подключения к базе",
                         MessageBoxButtons.OK, MessageBoxIcon.Error);
        Application.Exit();
      }
    }
 
    private void FillTables()
    {
      daContact = new OleDbDataAdapter("SELECT *FROM tblContact", cn);
      ds.Tables.Add();
      daContact.Fill(ds.Tables[0]);
      daPhone = new OleDbDataAdapter("SELECT *FROM tblPhone", cn);
      ds.Tables.Add();
      daPhone.Fill(ds.Tables[1]);
      DataRelation ContactPhoneRel = new DataRelation("RelContactPhone", ds.Tables[0].Columns[0], ds.Tables[1].Columns[1]);
      ds.Relations.Add(ContactPhoneRel);
      dataGridView1.DataSource = bsMain;
      dataGridView2.DataSource = bsChild;
      bsMain.DataSource = ds;
      bsMain.DataMember = ds.Tables[0].TableName;
      bsChild.DataSource = bsMain;
      bsChild.DataMember = ds.Relations[0].RelationName;
    }
 
    private void daContactsIns()
    {
      cmd = new OleDbCommand("INSERT INTO tblContact(Famil) VALUES(?)", cn);
      OleDbParameter p = new OleDbParameter("@Famil", OleDbType.Char);
      p.SourceColumn = "Famil";
      p.SourceVersion = DataRowVersion.Original;
      cmd.Parameters.Add(p);
      daContact.InsertCommand = cmd;
    }
 
    private void daContactsDel()
    {
      cmd = new OleDbCommand("DELETE FROM tblContact WHERE ID = ?", cn);
      OleDbParameter p = new OleDbParameter("@ID", OleDbType.BigInt);
      p.SourceColumn = "ID";
      p.SourceVersion = DataRowVersion.Current;
      cmd.Parameters.Add(p);
      daContact.DeleteCommand = cmd;
    }
 
 
    private void Form1_Load(object sender, EventArgs e)
    {
      {
        DBcon("Contacts.mdb");
        FillTables();
        daContactsIns();
        daContactsDel();
       }
    }
 
    private void btnSave_Click(object sender, EventArgs e)
    {
      daContact.Update(ds.Tables[0]);
    }
 
    private void btnRefresh_Click(object sender, EventArgs e)
    {
      //dataGridView1.Refresh();
      ds.Tables[1].Clear();
      ds.Tables[0].Clear();
      ds.Relations.Clear();
      FillTables();
    }
  }
}
При добавлении или удалении нескольких строк получаю ошибку: "Для элемента Update требуется действительный InsertCommand (DeleteСоmmand) при передаче коллекции DataRow с новыми (удаленными) строками". Помогите, пожалуйста, исправить ошибку. Проект прикрепил.
0
Вложения
Тип файла: zip ContactsForum.zip (33.4 Кб, 11 просмотров)
22.11.2016, 10:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2016, 10:43

Работа с базой данных Access: правка, поиск, добавление, удаление
Всем привет. Нужна консультация по поводу базы данных. Есть 2000 английских слов и русс.слов,...

ADO.NET + Oracle + Access
Добрый день! Встала очень хитрая задача передачи данных между Access в Oracle и обратно. Решил...

C# + ADO.NET + Access 2003. Не могу вставить запись
Доброго времени суток. Приложение не может вставить запись в таблицу, выдает ошибку "Ошибка...


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

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

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