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

Сохранение изменений в таблице

17.04.2017, 17:47. Просмотров 807. Ответов 10
Метки нет (Все метки)

Доброго времени суток. Знаю что тема заезжена но никак не найду ответа на казалось бы простой вопрос - есть таблица datagridview заполняется так :

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
dgv_CustomSizes.DataSource = dal.clientSizes(Convert.ToInt32(dgv_customers.Rows[e.RowIndex].Cells[0].Value));
//--------------//
        public DataTable clientSizes(int ID)
        {
            DataTable table = new DataTable();
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                string query = "select * from [customers_Sizes] where ID_customers = @ID";
                SqlCommand comm = new SqlCommand(query, conn);
                comm.Parameters.AddWithValue(@"ID", ID);
                SqlDataAdapter adapter = new SqlDataAdapter(comm);
                adapter.Fill(table);
                conn.Open();
            }
 
            return table;
        }
потом пользователь может поменять какие то ячейки и теперь нужно сохранить эту таблицу. как это сделать ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2017, 17:47
Ответы с готовыми решениями:

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

Сохранение изменений в таблице после закрытия окна
Мучаю машину уже неделю, а до ума все не доведу... Sql код в запросе работает,...

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

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

Отслеживание изменений в таблице
Итак, здравствуйте! Как отслеживать изменения в таблице? То есть если например...

10
Козадоев
112 / 108 / 26
Регистрация: 05.03.2013
Сообщений: 613
18.04.2017, 07:25 2
Цитата Сообщение от EvgenNews Посмотреть сообщение
как это сделать ?
Прописать метод Update для адаптера вручную, если предпочитаете ручное кодирование, и вызвать его, когда нужно сохранить данные
1
EvgenNews
4 / 4 / 1
Регистрация: 08.03.2017
Сообщений: 225
18.04.2017, 10:25  [ТС] 3
Не поделитесь примером кода?

Добавлено через 2 часа 5 минут
В общем я знаю как это сделать, у меня в DataSet.Tables находится нужная таблица но когда вызываю
C#
1
adapterSize.Update(recivedData.Tables[0]);
ничего не происходит

Добавлено через 37 минут
Пришел пока к такому коду для получения данных из таблице и создания адаптера :

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static string querySelect = "select * from [customers_Sizes] where ID_customers = @ID";
        private static DataSet recivedData;
        static public SqlDataAdapter adapterSize = new SqlDataAdapter(querySelect, connectionString);
        SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapterSize);
 
        public DataTable clientSizes(int ID)
        {
            DataTable table = new DataTable();
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                SqlCommand commSelect = new SqlCommand(querySelect, conn);
                commSelect.Parameters.AddWithValue(@"ID", ID);
                SqlDataAdapter adapterSize = new SqlDataAdapter(commSelect);
 
                conn.Open();
                recivedData = new DataSet();
                adapterSize.Fill(recivedData);
                adapterSize.Fill(table);
            }
            return table;
        }
метод для сохранения изменений

C#
1
2
3
4
5
6
7
8
9
public void setNewSizes()
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                adapterSize.UpdateCommand = cmdBuilder.GetUpdateCommand();
                conn.Open();
                adapterSize.Update(recivedData.Tables[0]);
            }
        }
при выполнении возникает ошибка -- необходимо объявить скалярную переменную @ID. как исправить ситуацию ?
0
Igr_ok
401 / 375 / 182
Регистрация: 04.08.2015
Сообщений: 1,041
18.04.2017, 11:12 4
Цитата Сообщение от EvgenNews Посмотреть сообщение
C#
1
commSelect.Parameters.AddWithValue(@"ID", ID);
Надо
C#
1
commSelect.Parameters.AddWithValue("@ID", ID);
0
EvgenNews
4 / 4 / 1
Регистрация: 08.03.2017
Сообщений: 225
18.04.2017, 11:29  [ТС] 5
Тогда пишет "необходимо объявить скалярную переменную "@ID""

Добавлено через 1 минуту
Знаю способ обновлять через ExecuteNonQuery, но тк таблица большая то нужно прописывать длиннющую портянку в строке команды UPDATE. А как я понимаю для этого и нужен DataSet.

Добавлено через 10 минут
Если бы ошибка была в "@ID" то и команда select бы не выполнилась.
0
Igr_ok
401 / 375 / 182
Регистрация: 04.08.2015
Сообщений: 1,041
18.04.2017, 12:37 6
Цитата Сообщение от EvgenNews Посмотреть сообщение
where ID_customers = @ID
Я так понимаю, что в таблице поля ID вообще нет. А параметр должен называться @ID_customers.
0
EvgenNews
4 / 4 / 1
Регистрация: 08.03.2017
Сообщений: 225
18.04.2017, 12:46  [ТС] 7
Да, верно. В таблице нет поля @ID. оно относится к :

C#
1
 commSelect.Parameters.AddWithValue("@ID", ID);
0
Igr_ok
401 / 375 / 182
Регистрация: 04.08.2015
Сообщений: 1,041
18.04.2017, 12:52 8
EvgenNews, я ж не проницательность демонстрировал, а хотел сказать, что вам нужно заменить название параметра на @ID_customers. Когда вы используете SqlCommandBuilder, он сам создает строку обновления и в ней будут реальные названия столбцов.
0
EvgenNews
4 / 4 / 1
Регистрация: 08.03.2017
Сообщений: 225
18.04.2017, 15:18  [ТС] 9
Пробовал. Если просто заменить
C#
1
commSelect.Parameters.AddWithValue("@ID", ID);
на
C#
1
 commSelect.Parameters.AddWithValue("@ID_customers", ID);
то программа не возвращает данные в DataTable.
попробовал вот так :
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
       static string querySelect = "select * from [customers_Sizes] where ID_customers = @ID_customers";
        private  DataSet recivedData;
        static public SqlDataAdapter adapterSize = new SqlDataAdapter(querySelect, connectionString);
        SqlCommandBuilder cmdBuilder;
 
 
        public DataTable clientSizes(int ID)
        {
            DataTable table = new DataTable();
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                SqlCommand commSelect = new SqlCommand(querySelect, conn);
                commSelect.Parameters.AddWithValue("@ID_customers", ID);
 
                adapterSize = new SqlDataAdapter(commSelect);
                cmdBuilder = new SqlCommandBuilder(adapterSize);
                recivedData = new DataSet();
 
                conn.Open();
                adapterSize.Fill(recivedData);
                table = recivedData.Tables[0];
            }
            return table;
        }
и метод обновления :

C#
1
2
3
4
5
6
7
8
9
10
11
 public void setNewSizes()
        {
 
        
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                adapterSize.UpdateCommand = cmdBuilder.GetUpdateCommand();
                adapterSize.Update(recivedData.Tables[0]);
            }
}
Теперь пишет что свойство connectionstring не инициализированно

Добавлено через 2 часа 8 минут
мне просто нужно сохранить изменения в базе данных через адаптер. неужели это настолько сложно?
0
Igr_ok
401 / 375 / 182
Регистрация: 04.08.2015
Сообщений: 1,041
18.04.2017, 19:27 10
Цитата Сообщение от EvgenNews Посмотреть сообщение
мне просто нужно сохранить изменения в базе данных через адаптер. неужели это настолько сложно?
Это просто. Сложен способ, который вы избрали.
1. Создание SqlDataAdapter. Перетаскиваете с панели инструментов компонент на форму. В запустившемся мастере настраиваете строку подключения и запрос
SQL
1
SELECT * FROM [customers_Sizes]
.
2. Источник данных. Самый простой вариант-создать типизированный DataSet. Кликаете правой кнопкой мыши по созданному компоненту SqlDataAdapter и выбираете в контекстном меню "Создать DataSet" (или что-то в этом духе, давно не пользовался).
3. Использование.
Методом sqlDataAdapter1.Fill(dataSet1) вы загружаете данные в DataSet. Если вам понадобится добавить WHERE в Select запрос, вы это делаете в sqlDataAdapter1.SelectCommand. Меняете текст запроса и добавляете параметр. Для того, чтобы сохранить сделанные пользователем изменения вызываете метод sqlDataAdapter1.Update(dataSet1), в который передаете в качестве параметра созданный DataSet.

П.2 можно и не делать. Можете самостоятельно создать DataTable, загружать в него данные и сохранять в БД сделанные в нем изменения.

И самое главное. Если у вас будет одна строка подключения, один SqlDataAdapter и один источник данных, вы не запутаетесь в собственном коде.
1
EvgenNews
4 / 4 / 1
Регистрация: 08.03.2017
Сообщений: 225
19.04.2017, 09:04  [ТС] 11
На самом деле вопрос встал из за неправильной трактовки MSDN где про метод GetUpdateCommand() обьекта SqlCommandBuilder написано буквально : 'Возвращает автоматически созданный SqlCommand объект, необходимый для выполнения обновлений в базе данных' вот я и пытался получить от него sql запрос на обновление.
C#
1
                adapterSize.UpdateCommand = cmdBuilder.GetUpdateCommand();
что бы избежать написания огромной портянки. Как правильно подсказали на другом форуме SqlCommandBuilder работает если прописаны все команды адаптера(select, update, delete)
0
19.04.2017, 09:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2017, 09:04

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

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

Сохранение изменений в Access
Здравствуйте, вопрос тривиальный, не сохраняются изменения, хотя ошибок нету,...


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

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

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