Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
18 / 18 / 15
Регистрация: 27.11.2013
Сообщений: 470
MS Access

Сохранение не работает

28.05.2015, 12:47. Показов 3034. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Как реализовать сохранение данных в БД? Создал базу с помощью access, загрузил содержимое таблицы в грид, реализовал поиск и удаление, но теперь не знаю как мне сохранить любые внесенные изменения в программу. Может кто подсказать?
Вот подключение:
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
string sql = "SELECT * FROM Фильмы";
            string connectionString;
 
            // DataTable сохраняет данные в памяти как таблицу
            DataTable dataTable = new DataTable();
 
            //Связывание с базой данных Access 2003 – *.mdb
            connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=Kino.mdb";
            OleDbConnection connection = new OleDbConnection(connectionString);
            connection.Open();
 
            OleDbCommand OleDbCommand = new OleDbCommand(sql, connection);
 
            dataAdapter = new OleDbDataAdapter(OleDbCommand);
 
            //Создаем построитель команд
            //Для адаптера становится доступной команда Update
            OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(dataAdapter);
 
            // Данные из адаптера поступают в DataTable
            dataAdapter.Fill(dataTable);
 
            // Связываем данные с элементом DataGridView
            dataGridView1.DataSource = dataTable;
 
            // Очистка
            connection.Close();
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.05.2015, 12:47
Ответы с готовыми решениями:

Не работает сохранение
Привет=) Я работаю с текстовым редактором. Вот код кнопки "Сохранить как": void __fastcall TForm2::N5Click(TObject *Sender) { if...

Не работает сохранение
У меня есть таблица в которую заносятся данные с этой таблицы надо изменять данные по ключу вот сам index откуда он подгружает кнопку ...

Не работает сохранение
Доброго времени суток,я делаю сохранение изображения и вот у меня какая проблема выдает вот эту ошибку код программы ...

37
18 / 18 / 15
Регистрация: 27.11.2013
Сообщений: 470
28.05.2015, 22:45  [ТС]
Студворк — интернет-сервис помощи студентам
Уже не нужна помощь. Создал для каждой из таблиц свой datatable и проблема решилась)
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
29.05.2015, 11:08
как грузите все это ? код покажите. точнее код Form_load и код кнопки по которой загружаете.
или весь код формы.

Добавлено через 40 секунд
Цитата Сообщение от FaNaT_96 Посмотреть сообщение
Уже не нужна помощь. Создал для каждой из таблиц свой datatable и проблема решилась)
ок, когда писал сообщения этого еще не было ))
0
18 / 18 / 15
Регистрация: 27.11.2013
Сообщений: 470
29.05.2015, 11:18  [ТС]
Цитата Сообщение от wm_leviathan Посмотреть сообщение
ок, когда писал сообщения этого еще не было ))
Скажите, а как можно прописать обновление для нескольких таблиц, столбцы которых отображены в гриде?
Изначально я работал с одной таблицей, но преподу не понравилось то, что вместо, допустим, названия прокатчика фильма стоит его id из другой таблице. Я запросом сделал отображение названия, но теперь возникла проблема обновления этих двух таблиц.
Знаю, что нужно писать руками метод Update, но как его сделать правильно совершенно не понимаю.

C#
1
2
3
4
conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;" +
                                      "Data Source=2.mdb");
 
            adapter = new OleDbDataAdapter("SELECT Фильмы.ID_фильма, Фильмы.Название, Фильмы.Год, Фильмы.Продолжительность, Прокатчик.Наименование, Фильмы.Жанр FROM Фильмы, Прокатчик", conn);
Как видите, тут использованы данные из таблиц Фильмы и Прокатчик.
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
29.05.2015, 13:28
может как то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void btnUpdate_Click(object sender, EventArgs e)
        {
                    string sql = "insert into [Фильмы] ([Название], [Год], [Продолжительность], [Жанр]) values " +
                    "('" + dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[1].Value.ToString() + "','" +
                        dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[2].Value.ToString() + "','" +
                        dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[3].Value.ToString() + "','" +
                        dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[5].Value.ToString() + "');
                OleDbConnection con = new OleDbConnection(connStr);
                con.Open();
                dataAdapter.InsertCommand = new OleDbCommand(sql,con);
                dataAdapter.InsertCommand.ExecuteNonQuery();
                con.Close();
            
        }
Добавлено через 3 минуты
а вообще прокатчика надо делать справочником и выводить отдельно куда то.
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
29.05.2015, 14:24
Цитата Сообщение от FaNaT_96 Посмотреть сообщение
Знаю, что нужно писать руками метод Update, но как его сделать правильно совершенно не понимаю.
зачем, вы адпейтите не таблицу, а источник данных, который к ней привязан, т.е. вносить изменения для сохранения надо в datatable или dataset, а commandbuilder для них сам пишет апдейт
0
18 / 18 / 15
Регистрация: 27.11.2013
Сообщений: 470
29.05.2015, 14:32  [ТС]
Цитата Сообщение от wm_leviathan Посмотреть сообщение
а вообще прокатчика надо делать справочником и выводить отдельно куда то.
Я бы с радостью, но препод требует как минимум 4 таблицы, и в 2 из них такая вот проблема с сохранением. Ваш способ у меня не работает, к сожалению.
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
29.05.2015, 14:46
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
Сommandbuilder для них сам пишет апдейт
для связных он не напишет
Цитата Сообщение от FaNaT_96 Посмотреть сообщение
Ваш способ у меня не работает, к сожалению
а он не для копипаста, а для примера. так то он работает на вчерашнем проекте что скидывали.
0
18 / 18 / 15
Регистрация: 27.11.2013
Сообщений: 470
29.05.2015, 15:05  [ТС]
Цитата Сообщение от wm_leviathan Посмотреть сообщение
а он не для копипаста, а для примера. так то он работает на вчерашнем проекте что скидывали.
так естественно, что я подставил его под свой проект. Может быть, сделал это не правильно?
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
 
namespace WindowsFormsApplication23
{
    public partial class Form1 : Form
    {
        string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=2.mdb";
        DataTable tbl = new DataTable();
        OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
        OleDbConnection con = new OleDbConnection();
 
        public Form1()
        {
            InitializeComponent();
        }
 
 
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
 
           
            string sql = "SELECT Фильмы.ID_фильма, Фильмы.Название, Фильмы.Год, Фильмы.Продолжительность, Прокатчик.Наименование, Фильмы.Жанр FROM Фильмы, Прокатчик";
            OleDbCommand command = new OleDbCommand(sql);
            OleDbConnection con = new OleDbConnection(connStr);
            con.Open();
            dataAdapter.SelectCommand = command;
            dataAdapter.SelectCommand.Connection = con;
            dataAdapter.SelectCommand = command;
            tbl.Locale = System.Globalization.CultureInfo.InvariantCulture;
            dataAdapter.Fill(tbl);
            dataGridView1.DataSource = tbl;
            
            
            
        }
 
 
 
 
        private void btnUpdate_Click(object sender, EventArgs e)
        {
          /*  using (var cmdBuilder = new OleDbCommandBuilder(dataAdapter))
                dataAdapter.Update(tbl); */
            string sql = "insert into [Фильмы] ([Название], [Год], [Продолжительность], [Жанр]) values " +
                    "('" + dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[1].Value.ToString() + "','" +
                        dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[2].Value.ToString() + "','" +
                        dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[3].Value.ToString() + "','" +
                        dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[5].Value.ToString() + "')";
            OleDbConnection con = new OleDbConnection(connStr);
            con.Open();
            dataAdapter.InsertCommand = new OleDbCommand(sql, con);
            dataAdapter.InsertCommand.ExecuteNonQuery();
            con.Close();
            
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            con.Close();
        }
    }
}
Если убрать комментарии от предыдущего способа обновления, то вылетает ошибка: "Динамическое создание SQL для нескольких базовых таблиц не поддерживается."
Но это касается лишь того случая, если в строке sql я указываю столбец из другой таблицы. В моем случае это "Прокатчик.Наименование". Если на его место поставить ID_прокатчика, который я задавал ранее в этой же таблице, то ошибки нет, но такой вид препода не устраивает. В общем, тупик для меня.
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
29.05.2015, 15:18
Цитата Сообщение от wm_leviathan Посмотреть сообщение
для связных он не напишет
что значит не пашет, еще раз повторяю, данные для обновления в базе вы берете не из таблиц, а из источника данных, commandbuilder работает даже если половина таблиц заполняется триггерами
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
29.05.2015, 15:33
Fene4ka_, если вас не затрудник покажите пример, буду весьма признателен

к примеру есть 2 таблицы "a" и "b" запросом получаю данные
select a.name,b.city from a inner join b on a.id_city = b.id
загоняю их в адаптер
и делаю филл DataTable
дале отображаю в гриде
покажите если не трудно как через SqlCommandBuilder сделать добавление данных в эти 2 таблицы.
0
18 / 18 / 15
Регистрация: 27.11.2013
Сообщений: 470
29.05.2015, 17:09  [ТС]
Проблему удалось нейтрализовать при помощи INSERT INTO, но не думаю, что это оптимальный вариант, так как я сделал лишь добавление данных. Надо сейчас как-то преобразовать INSERT в UPDATE и тогда будет все отлично.

C#
1
2
3
4
5
6
7
8
9
 conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;" +
                             "Data Source=Kino.mdb");
 
            string queryString = "INSERT INTO Прокатчик (ID_прокатчика, Наименование, Адрес) VALUES (" + textBox2.Text + "," + textBox3.Text + "," + textBox4.Text + ");";
 
            OleDbCommand command = new OleDbCommand(queryString, conn);
            command.Connection.Open();
            command.ExecuteScalar();
            conn.Close();
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
29.05.2015, 17:20
Цитата Сообщение от FaNaT_96 Посмотреть сообщение
преобразовать INSERT в UPDATE
update при редактировании данных.
0
18 / 18 / 15
Регистрация: 27.11.2013
Сообщений: 470
29.05.2015, 17:23  [ТС]
Цитата Сообщение от wm_leviathan Посмотреть сообщение
update при редактировании данных
Так я это понимаю. Есть идея просто редактировать содержимое ячейки грида и заменять её содержимое на содержимое текстбокса, в котором будет храниться новое значение, но хотелось бы, чтобы после ввода данных в саму ячейку, без посторонних компонентов, я мог просто нажать "Обновить" и все. Но я пока не придумал, как можно считать то, что записал в эту ячейку.
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
29.05.2015, 17:28
Цитата Сообщение от FaNaT_96 Посмотреть сообщение
чтобы после ввода данных в саму ячейку, без посторонних компонентов, я мог просто нажать "Обновить"
это команда insert
Цитата Сообщение от FaNaT_96 Посмотреть сообщение
Есть идея просто редактировать содержимое ячейки грида и заменять её содержимое на содержимое текстбокса
это будет update
0
18 / 18 / 15
Регистрация: 27.11.2013
Сообщений: 470
29.05.2015, 17:34  [ТС]
Цитата Сообщение от wm_leviathan Посмотреть сообщение
это будет update
значит без постороннего компонента никак не обойтись?
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
30.05.2015, 12:15
wm_leviathan, добавляйте данные в datatable, а потом отображайте их в datagrid, кроме того привыкайте на каждый грид делать свой datatable, Раз уж вы отказываетесь от dataset
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
30.05.2015, 12:47
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
Раз уж вы отказываетесь от dataset
я не отказываюсь, просто в данном случае 1го DT вполне хватает. содержимое DT есть результат запроса выводящего из 2х таблиц. Вы так и не показали как обновить этот DT ((
0
18 / 18 / 15
Регистрация: 27.11.2013
Сообщений: 470
30.05.2015, 13:33  [ТС]
Fene4ka_, Тоже очень хотел бы увидеть данный пример. Глядишь, помогло бы мне полностью решить мою проблему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.05.2015, 13:33

Не работает сохранение
Прикрепил этот скрипт к камере, для сохранения монет: using System; using System.IO; using UnityEngine; public class Game :...

Не работает сохранение в БД
Делаю сохранение в БД, когда добавляю запись и нажимаю сохранить, выдает ошибку, но как ошибку, MessageBox выводит. и только его ...

Far Cry 3 - не работает сохранение
У меня проблема с Far Cry 3!:help::(Игра запускается,играю все норм,не глючет,не заедает:good:,но не сохраняется!что мне делать????ПОМОГИТЕ...

Не работает сохранение в бинарный файл
помогите пожалуйста, вроде все работает кроме бинарного сохранения в файл TPop*data,*tmp; FILE*Txt; int fh=0; ...

Почему не работает сохранение настроек
3ч уже никак не пойму почему не работает сохранение настроек через Settings. Началось все с того, что днем я сделал сохранение...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru