Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 177
1
MS Access

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

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

Author24 — интернет-сервис помощи студентам
Учусь работать с базой данных 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. Как перехватить ошибку при добавлении, вывести диагностические данные и закрыть соединение с базой?
Проект прикрепил.
Вложения
Тип файла: zip ContactsForum.zip (34.1 Кб, 9 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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"....

ADO.net MVC 4 работа с базой данных
Здравствуйте! Пишу проект на ASP.NET MVC 4. База данных для этого проекта изначально не...

Работа с базой данных Access с помощью VB NET STUDIO'2010
подскажите. ПОЖАЛУЙСТА, где можно скачать пример работы с базой данных Access с помощью VB NET...

7
Эксперт .NET
12073 / 8383 / 1280
Регистрация: 21.01.2016
Сообщений: 31,576
21.11.2016, 14:32 2
tuchin, ты не задал значения параметров.

Текст с сообщением об ошибке и, возможно, подробностями можно увидеть в теле исключения, которое генерируется в момент неудачной записи в БД.
0
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 177
21.11.2016, 14:56  [ТС] 3
Так значения, как я понял, должны задаваться при добавлении строки в таблице. Так, например, в пятой строке я ввожу нужные мне данные и вроде бы они должны подставляться вместо вопросов. Как сделать, чтобы это было именно так?
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
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
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 177
21.11.2016, 15:08  [ТС] 5
А как сделать так, чтобы идентификатор автоматически увеличивался на 1, а вместо параметров подставлялись данные, введенные в новой строке таблицы, а не фиксированные данные?
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
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
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 177
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
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 177
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 с новыми (удаленными) строками". Помогите, пожалуйста, исправить ошибку. Проект прикрепил.
Вложения
Тип файла: zip ContactsForum.zip (33.4 Кб, 18 просмотров)
0
22.11.2016, 10:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2016, 10:43
Помогаю со студенческими работами здесь

Работа с базой через ADO из DLL
Пытаюсь законнектится к базе через ADO компоненты из Dll-ки. При попытке вызвать метод close для...

Соединение И Работа С Базой 1с Через .net (c#)
Здравствуйте! Столкнулся с такой проблемой: есть сайт, написанный на ASP.NET (C#), есть база...

Работа с базами Access через ADO
Всем привет!!! Хочу наваять програмку типа каталогизатора, соответственно чтоб она работала с...

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru