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

Сохранение изменений в Access - C#

12.06.2014, 21:25. Просмотров 1896. Ответов 12
Метки нет (Все метки)

Здравствуйте, вопрос тривиальный, не сохраняются изменения, хотя ошибок нету, после перезапуска изменений не видно и в самом файле базы изменений не наступает...
C#
1
2
3
4
5
6
7
8
9
10
 private void button5_Click(object sender, RoutedEventArgs e)
        {     
            OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|/Gallery.accdb");
            con.Open();
            string sql = String.Concat("delete FROM ПроизведениеИскусства WHERE КодовоеНазвание = '", art.КодовоеНазвание,"'");
            OleDbCommand command = new OleDbCommand(sql, con);
            command.ExecuteNonQuery();
            MessageBox.Show(" Запись удалена");
            con.Close();
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2014, 21:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сохранение изменений в Access (C#):

Сохранение изменений сделанных программно в datagridview который связан с бд Access
В общем, у меня есть датагрид связанный через выбор источника данных, и он...

Сохранение изменений в бд
База данных подключена как источник данных. В переменную DataRow записывается...

Сохранение изменений в БД
Здравствуйте! БД загружена в проект и отображается в DataGridView. Удаляя...

Сохранение изменений в DataGridView
здравствуйте! у меня проблема с DataGridView я немогу сохорнить то што я...

Сохранение изменений в таблице
Доброго времени суток. Знаю что тема заезжена но никак не найду ответа на...

Сохранение изменений в таблице
Помогите сделать что бы кнопка сохраняла изменения в таблице public...

12
nmcf
6243 / 5555 / 2526
Регистрация: 14.04.2014
Сообщений: 23,352
12.06.2014, 22:24 #2
Замени Concat() на строку с конкретным значением для "КодовоеНазвание" и посмотри, что получится.
1
ZeViS
3 / 3 / 1
Регистрация: 30.08.2012
Сообщений: 62
12.06.2014, 22:38  [ТС] #3
Цитата Сообщение от nmcf Посмотреть сообщение
Замени Concat() на строку с конкретным значением для "КодовоеНазвание" и посмотри, что получится.
Тоже самое... изменения наступают и видны, пока не перезапущу программу, кстати тоже самое происходит с инсертом, скорее всего где-то я не сохраняю изменения...
0
nmcf
6243 / 5555 / 2526
Регистрация: 14.04.2014
Сообщений: 23,352
12.06.2014, 22:57 #4
Где они видны? У тебя даже связи с элементами управления нет.
1
ZeViS
3 / 3 / 1
Регистрация: 30.08.2012
Сообщений: 62
13.06.2014, 00:57  [ТС] #5
Ну у меня там на быдлокоде завязано...

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
WpfApplication2.GalleryDataSet galleryDataSet = ((WpfApplication2.GalleryDataSet)(this.FindResource("galleryDataSet")));
 
            var query = from m in galleryDataSet.Произведения
 
                        select m;
 
            ObservableCollection<GalleryDataSet.ПроизведенияRow>
              List = new ObservableCollection<GalleryDataSet.ПроизведенияRow>();
            foreach (GalleryDataSet.ПроизведенияRow qq in query)
            {
                if (seria != "")
                {
                    if (qq.НазваниеСерии == seria)
                        List.Add(qq);
                }
                else
                    List.Add(qq);
 
            }
            if (List.Count == 0)
            {
                MessageBox.Show("Таких не найдено");
            }
            else
                произведенияViewSource.Source = List;
здесь при обновлении видны изменения)

Добавлено через 1 минуту
Кстати, наверное есть возможность сохранить изменения в базу с помощью датасета этого?

Добавлено через 57 секунд
Удалять записи из датасета и сохранять его в базу

Добавлено через 1 час 35 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
GalleryDataSetTableAdapters.ПроизведениеИскусстваTableAdapter qq = new GalleryDataSetTableAdapters.ПроизведениеИскусстваTableAdapter();
            WpfApplication2.GalleryDataSet galleryDataSet1 = ((WpfApplication2.GalleryDataSet)(this.FindResource("galleryDataSet")));
            var query1 = from m in galleryDataSet1.ПроизведениеИскусства
                         where m.КодовоеНазвание == artik.КодовоеНазвание
                         select m;        
            foreach (GalleryDataSet.ПроизведениеИскусстваRow qqq in query1)
            {
               galleryDataSet1.ПроизведениеИскусства.RemoveПроизведениеИскусстваRow(qqq);
                galleryDataSet1.AcceptChanges();
                break;
            }
            
 
            qq.Update(galleryDataSet1);
Дальше сохранения в датасете почему-то не идет, при перезапуске окна, не проекта, а именно окна, все изменения слетают...
0
kodv
1417 / 1091 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
13.06.2014, 05:50 #6
ZeViS,
C#
1
 galleryDataSet1.AcceptChanges();
эту строку уберите. Из-за нее метод Update не видит изменений. Для подробностей читайте описание метода на MSDN.
PS: Не совсем понятно, что у вас лишнее: foreach или break, но что то из них точно лишнее, так как по факту всегда происходит всего одна итерация цикла.
1
ZeViS
3 / 3 / 1
Регистрация: 30.08.2012
Сообщений: 62
13.06.2014, 08:02  [ТС] #7
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 GalleryDataSetTableAdapters.TableAdapterManager qq = new GalleryDataSetTableAdapters.TableAdapterManager();
            var query1 = from m in galleryDataSet.ПроизведениеИскусства
                         where m.КодовоеНазвание == artik.КодовоеНазвание
                         select m;
            foreach (GalleryDataSet.ПроизведениеИскусстваRow qqq in query1)
            {
                galleryDataSet.ПроизведениеИскусства.RemoveПроизведениеИскусстваRow(qqq);
                galleryDataSet.Произведения.RemoveПроизведенияRow(artik);
                break;
            }
 
            qq.UpdateAll(galleryDataSet);
            //galleryDataSet.AcceptChanges();
С foreach все нормально, находит и удаляет то, что нужно, ибо мне и надо удалить одну запись, но вот изменения дальше датасета не проходят. Дело в том, что у меня Произведения, это представление, а ПроизведениеИскусства, это основная таблица, поэтому мне надо по кодовому названию из Произведения найти и удалить запись в ПроизведениеИскусства и удалить саму запись в представлении, в датасете изменения проходят, но через tableadapter не проходит, хотя вязвлось оно автоматом в дизайнере... Сейчас попробовал глобально через updateall, тоже самое(

Добавлено через 13 минут
Вернее изменения не выходят дальше изменений в экземпляре датасета, вот так правильнее)
0
kodv
1417 / 1091 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
13.06.2014, 08:13 #8
ZeViS, по-моему, Remove физически удаляет строку, а Delete логически, по крайней мере в обычной DayaTable. В типизированой, скорее всего также. Попробуйте удалять через Delete.
Что касается цикла, то в цикле нет смысла, если планируется всего одна итерация? Не проще эти дйствия делать просто для первого элемента коллекции без foreach?
1
Блондинка с ОЗМ
Заблокирован
13.06.2014, 09:00 #9
ZeViS, чтобы изменения из датасета попали в БД, надо либо еще при заливке БД в датасет сооружать DbCommandBuilder

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
public static DataSet UpdateRows(string connectionString,
    string queryString, string tableName)
{
    DataSet dataSet = new DataSet();
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        OleDbDataAdapter adapter = new OleDbDataAdapter();
        adapter.SelectCommand = new OleDbCommand(queryString, connection);
        OleDbCommandBuilder cb = new OleDbCommandBuilder(adapter);
 
        connection.Open();
 
        adapter.Fill(dataSet, tableName);
 
        //code to modify data in DataSet here
 
        cb.GetDeleteCommand();
        //Without the OleDbCommandBuilder this line would fail
        adapter.Update(dataSet, tableName);
 
        connection.Close();
    }
    return dataSet;
}
либо генерить запросы вручную.. ну еще можно класс для БД написать
Класс Session
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
 
namespace СУБД_ООП_Cs_2008
{
    public class Session
    {
        OleDbConnection connection;
        OleDbCommand command;
 
 
        public void ConnectTo()
        {
            connection = new OleDbConnection("provider=microsoft.jet.oledb.4.0; data source=" + System.Windows.Forms.Application.StartupPath + "\\dbTest.mdb");
            command = connection.CreateCommand();
        }
 
        public Session()
        {
            ConnectTo();
        }
 
 
        public void Insert(Description description)
        {
            try
            {
                command.CommandText = "INSERT INTO temp (id_p, name, [value], id_t, stage, diagnosis) VALUES(' " +
                    description.id_p + " ', ' " + description.name  + " ', ' " +
                    description.myvalue + " ', ' " + description.id_t + " ', ' " +
                    description.stage + " ', ' " + description.diagnosis + " ' );";
               //command.CommandType =  command.CommandText;
               //command.CommandType = CommandType.Text;
                
                connection.Open();
 
                command.ExecuteNonQuery();
            }
 
            catch (Exception)
    
            {
                throw;
            }
 
 
            finally
            {
                if (connection != null)
                {
                    connection.Close();
                }
            }
        }
        //завершился метод
 
        public List<Description> FillComboBox()
        {
            List<Description> descriptionsList = new List<Description>();
 
            try
            {
                command.CommandText = "SELECT * FROM temp;" ;
                //(id_p, name, [value], id_t, stage, diagnosis) VALUES(' " + 
                //    description.id_p + " ', ' " + description.name  + " ', ' " +
                //    description.myvalue + " ', ' " + description.id_t + " ', ' " +
                //    description.stage + " ', ' " + description.diagnosis + " ' );";
                connection.Open();
 
                OleDbDataReader reader = command.ExecuteReader();
 
                while (reader.Read())
                {
                    Description description = new Description();
                    description.id = Convert.ToInt32(reader["id"].ToString());
                    description.id_p = reader["id_p"].ToString();
                    //MessageBox.Show(description.id_p);
                    description.name = reader["name"].ToString();
                    description.myvalue = reader["value"].ToString();
                    description.id_t = reader["id_t"].ToString();
                    description.stage = reader["stage"].ToString();
                    description.diagnosis = reader["diagnosis"].ToString();
 
                    descriptionsList.Add(description);
                }
 
                return descriptionsList;
            }
 
            catch (Exception)
            {
                throw;
            }
 
 
            finally
            {
                if (connection != null)
                {
                    connection.Close();
                }
            }
 
        }
 
        //---------------------------------
         public void Update(Description oldDescription, Description newDescription)
 {
 
   try
   {
   command.CommandText = "UPDATE temp SET id_p = "+newDescription.id_p + 
       ", name = "+newDescription.name + ", [value] = "+newDescription.myvalue + 
       ", id_t = "+newDescription.id_t + ", stage = "+newDescription.stage + 
       ", diagnosis = "+newDescription.diagnosis + " WHERE ID = " + oldDescription.id;
 
   connection.Open();
 
   command.ExecuteNonQuery();
    }
 
    catch (Exception)
            {
                throw;
            }
 
 
            finally
            {
                if (connection != null)
                {
                    connection.Close();
                }
            }
 
        }
        //-----------------------------------------------
        public void Delete(Description description)
 {
 
   try
   {
   command.CommandText = "DELETE FROM temp WHERE ID = "+description.id;
 
   connection.Open();
 
   command.ExecuteNonQuery();
    }
   catch (Exception)
            {
                throw;
            }
 
 
            finally
            {
                if (connection != null)
                {
                    connection.Close();
                }
            }
 
        }
//------------------------------------------------
    }
}
1
ZeViS
3 / 3 / 1
Регистрация: 30.08.2012
Сообщений: 62
13.06.2014, 09:39  [ТС] #10
Всем спасибо, я дурачек, провозился 3 дня и нашел в чем косяк, самый первый мой вариант с
Цитата Сообщение от ZeViS Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
 private void button5_Click(object sender, RoutedEventArgs e)
        {     
            OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|/Gallery.accdb");
            con.Open();
            string sql = String.Concat("delete FROM ПроизведениеИскусства WHERE КодовоеНазвание = '", art.КодовоеНазвание,"'");
            OleDbCommand command = new OleDbCommand(sql, con);
            command.ExecuteNonQuery();
            MessageBox.Show(" Запись удалена");
            con.Close();
        }
работает, просто я при перезапуске проекта компилировал базу из проекта, она обновлялась и как бы изменений не был видно... Всем Спасибо!
0
Цапер
0 / 0 / 0
Регистрация: 19.06.2017
Сообщений: 7
21.06.2017, 11:37 #11
А собственно что Вы изменили в своём коде? Просто у меня в программе тоже изменения не сохраняются в БД. А код у нас одинаковый.
0
OwenGlendower
Супер-модератор
Эксперт .NET
8755 / 7759 / 3320
Регистрация: 17.03.2014
Сообщений: 15,260
Записей в блоге: 1
21.06.2017, 12:47 #12
Цапер, ТС же ясно написал, что проблема была не в коде, а в копировании базы в выходной каталог. Из-за этого данные и терялись.
0
Цапер
0 / 0 / 0
Регистрация: 19.06.2017
Сообщений: 7
21.06.2017, 13:18 #13
Извините, товарищ модератор, тогда Вы не могли бы подсказать как это устранить?)
0
21.06.2017, 13:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2017, 13:18
Привет! Вот еще темы с решениями:

Сохранение изменений в dataGridView
db = new DataClasses1DataContext(); dataGridViewClientSet.DataSource =...

Расшифровка, изменение и сохранение изменений в БД
Есть база данных, в которой находятся два отношения (таблицы): 1 отношение...

Сохранение всех изменений из dataGridView в БД
Доброго времени суток, господа форумчане и с новым годом вас! Есть такая...

Сохранение изменений в Базе Данных
Всем доброго времени суток! Есть проблема, не могу сохранить изменения в базе...


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

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

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