Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 2
Регистрация: 13.10.2014
Сообщений: 244

Не удается добавить несколько строк

07.02.2017, 19:08. Показов 1280. Ответов 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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Windows.Forms;
 
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 OleDbParameter p;
 
    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);
      p = new OleDbParameter("@Famil", OleDbType.WChar);
      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);
      p = new OleDbParameter("@ID", OleDbType.BigInt);
      p.SourceColumn = "ID";
      p.SourceVersion = DataRowVersion.Current;
      cmd.Parameters.Add(p);
      daContact.DeleteCommand = cmd;
    }
 
    private void daContactsUpd()
    {
      cmd = new OleDbCommand("UPDATE tblContact SET Famil = ? WHERE ID = ?", cn);
      p = new OleDbParameter("@Famil", OleDbType.WChar);
      p.SourceColumn = "Famil";
      p.SourceVersion = DataRowVersion.Current;
      cmd.Parameters.Add(p);
      p = new OleDbParameter("@ID", OleDbType.BigInt);
      p.SourceColumn = "ID";
      p.SourceVersion = DataRowVersion.Current;
      cmd.Parameters.Add(p);
      daContact.UpdateCommand = cmd;
    }
 
    private void Form1_Load(object sender, EventArgs e)
    {
      {
        DBcon("Contacts.mdb");
        FillTables();
        daContactsIns();
        daContactsDel();
        daContactsUpd();
      }
    }
 
    private void btnSave_Click(object sender, EventArgs e)
    {
      daContact.Update(ds.Tables[0]);
    }
 
    private void btnRefresh_Click(object sender, EventArgs e)
    {
      ds.Tables[1].Clear();
      ds.Tables[0].Clear();
      ds.Relations.Clear();
      FillTables();
    }
 
  }
}
несколько строк удаляется, изменяется, но при попытке добавить вторую строку появляется ошибка из-за пустого значения идентификатора. Подскажите, пожалуйста,как это исправить. Проект прикрепил.
Вложения
Тип файла: zip ContactsTest.zip (32.2 Кб, 5 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.02.2017, 19:08
Ответы с готовыми решениями:

Как добавить, обновить и удалить несколько строк в DataTable?
Как можно сделать добавление не одной строки в DataTable, а сразу нескольких, если конечно такое возможно!? Так же для обновления и...

Как одновременно добавить несколько строк в таблицу Access?
А возможно одновременно добавить несколько строк в таблицу Access? например как при вставке в таблицу MySQL: ... string insert =...

Добавить несколько строк в файл
Необходимо добавить несколько строк из нескольких textBox в файл с помощью System.IO.File.AppendAllText. Такое в лабораторной задание. ...

12
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
08.02.2017, 04:38
Странно но у меня все работает, по крайней мере строки добавляются без проблем. Скажите что именно вы делаете для добавления.
0
2 / 2 / 2
Регистрация: 13.10.2014
Сообщений: 244
08.02.2017, 10:55  [ТС]
Если я добавляю одну строку и нажимаю Записать-Обновить, то строка добавляется нормально. Если я ввожу несколько строк без нажатия этих кнопок, то при вводе второй строки появляется ошибка присвоения Null. Видимо, это связано с неправильным увеличением номера первичного ключа. Но как это исправить - я не знаю.
0
2 / 2 / 2
Регистрация: 13.10.2014
Сообщений: 244
08.02.2017, 12:12  [ТС]
Скринфот ошибки
Миниатюры
Не удается добавить несколько строк  
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
08.02.2017, 13:47
tuchin, сделайте поле id счетчиком. Сейчас у вас оно как текст.
0
2 / 2 / 2
Регистрация: 13.10.2014
Сообщений: 244
08.02.2017, 23:07  [ТС]
Посмотрел базу. В таблице tblContacts ID - счетчик. В тексте программы ID - BigInt. В каком месте программы у меня ID имеет текстовое значение? Где нужно ID заменить на счетчик?
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
09.02.2017, 06:20
Цитата Сообщение от tuchin Посмотреть сообщение
Видимо, это связано с неправильным увеличением номера первичного ключа. Но как это исправить - я не знаю.
Нет он пишет что значение ID не уникальное, то есть в обоих случаях "".
Исправить можно если при заполнении поля он будет по дефолту выставлять максимальное возможное значение ID +1 ну или как-то так.

Добавлено через 35 минут
То есть вот на выбор:
1) Получить максимальное ИД из базы и подставить прибавляя при каждой новой строке 1
Если охота чтобы работал именно счетчик базы
2) Выставлять например отрицательное значение а при сохранении почереди им задавать null
3) Сохранять автоматом запись при добавлении
4) Другие варианты которые мне лень было придумывать
0
2 / 2 / 2
Регистрация: 13.10.2014
Сообщений: 244
09.02.2017, 07:26  [ТС]
Спасибо за ответ. А можно связать таблицы так, чтобы при добавлении счетчик работал правильно без определения максимального ID и добавлении 1? Ведь при использовании мастера для связи таблиц при добавлении таких проблем, как у меня, не возникает.
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
09.02.2017, 07:50
Я искал другие варианты чтобы это работало нормально, но так и не нашел. Только костыли:black_eye.:

Добавлено через 6 минут
Да и к тому же острой необходимости у меня в этом не было, потому что все записи добавляются через форму.
0
79 / 102 / 44
Регистрация: 12.05.2015
Сообщений: 476
09.02.2017, 08:28
Лучший ответ Сообщение было отмечено tuchin как решение

Решение

tuchin, можно все.
Во-первых, инициализироваться все ваши датасеты, таблицы, отношения должны один раз. Следовательно их необходимо вынести, например в обработчик события формы Load.
Во-вторых, необходимо заполнить через адаптер схемы таблиц.
Кликните здесь для просмотра всего текста
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
private void Form1_Load(object sender, EventArgs e)
{
    {
        DBcon("Contacts.mdb");
        daContact = new OleDbDataAdapter("SELECT *FROM tblContact", cn);
        ds.Tables.Add();
        daContact.FillSchema(ds.Tables[0], SchemaType.Mapped); // Обратить внимание, используем метод FillSchema
        daPhone = new OleDbDataAdapter("SELECT *FROM tblPhone", cn);
        ds.Tables.Add();
        daPhone.FillSchema(ds.Tables[1], SchemaType.Mapped); // Обратить внимание, используем метод FillSchema
        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;
 
        FillTables();
        // Команды можно создать автоматически, главное чтобы был первичный ключ и SelectCommand:
        OleDbCommandBuilder cmdContacts = new OleDbCommandBuilder(daContact); 
        OleDbCommandBuilder cmdPhone = new OleDbCommandBuilder(daPhone);
    }
}

В-третьих, очищайте датасет, а не каждую таблицу.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
private void btnRefresh_Click(object sender, EventArgs e)
{
    ds.Clear();
    FillTables();
}

Ну и в методе FillTables() осталось только заполнение ваших датасетов.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
private void FillTables()
{
    daContact.Fill(ds.Tables[0]);
    daPhone.Fill(ds.Tables[1]);
}

На выходе у вас нет проблем практически ни с чем.
0
2 / 2 / 2
Регистрация: 13.10.2014
Сообщений: 244
09.02.2017, 21:41  [ТС]
Спасибо огромное за ответ и код! Особенно понравилось, что команды можно не программировать, а создавать CommandBuilder, а также переносить в таблицы DataSet схему из базы данных с помощью FillSchema. А когда нужно использовать SchemaType.Mapped, а когда - SchemaType.Source?
0
79 / 102 / 44
Регистрация: 12.05.2015
Сообщений: 476
10.02.2017, 01:18
Лучший ответ Сообщение было отмечено tuchin как решение

Решение

Цитата Сообщение от tuchin Посмотреть сообщение
А когда нужно использовать SchemaType.Mapped, а когда - SchemaType.Source?
Ссылка на MSDN
SchemaType Обычно следует установить значение Mapped, поскольку все установленные сопоставления таблиц и столбцов используются.
1
2 / 2 / 2
Регистрация: 13.10.2014
Сообщений: 244
10.02.2017, 09:45  [ТС]
Спасибо. Понял
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.02.2017, 09:45
Помогаю со студенческими работами здесь

Как добавить несколько строк в DataTable?
В отдельном классе для "DataTable". Класс "DataTable" // Добавляем несколько строк public DataRow DataRowAddMore() { ...

Добавить несколько строк в зубчатый массив
Моя цель - добавить несколько строк в зубчатый массив. Для этого я создал метод AddSomeStrings. Но ничего не получается. P.S. массив...

Добавить несколько пустых строк в dataGridView в цикле
Помогите пожалуйста разобраться с проблемой. Почему не работает данный код? for(int i=1; i<10;i++) { ...

Добавить несколько строк в тч
День добрый. Есть обработка которая загружает из excel данные в тч документа. Проблема в том что загружает она одну запись , а нужно...

Как добавить несколько строк в таблицу
Здравствуйте. Есть таблица table{number integer, date datetime, any_polya} number и date вместе образуют ключ. Я хочу добавить в...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru