Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
1

c#. Обновление таблицы без ключевого поля.

23.07.2011, 10:09. Показов 3508. Ответов 16
Метки нет (Все метки)

Доброго времени суток!

С помощью следующего кода я обновляю содержимое таблицы содержимым dataGridView (adapter настроен соответственно - на запрос всего, что есть в текущей таблице):

C#
1
2
3
4
5
6
OleDbCommandBuilder ComBilder = new OleDbCommandBuilder(adapter);
                
adapter.UpdateCommand = ComBilder.GetUpdateCommand();                
adapter.Update(dataGridView.DataSource as DataTable);
(dataGridView.DataSource as DataTable).AcceptChanges();
MessageBox.Show("Изменения успешны!");
Все работает чудесно. Но только для таблиц, имеющих ключевое поле, а приложению приходится работать с автоматически сгенерированными таблицами без ключевых полей, для которых этот код не подходит.

Вопрос: каким образом мне будет лучше обновлять содержимое таблицы без ключевого поля содержимым dataGridView?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.07.2011, 10:09
Ответы с готовыми решениями:

Заполнение базы данных с определенного номера поля ключевого поля
Добрый день, написан код для заполнения таблицы на c#, но при запуске выдает ошибку, что не может...

Создание ключевого поля
Здравствуйте , нужно в БД добавить таблицу и в ней нужно добавить ключевой столбец "Номер п/п" ....

Присваивание ключевого поля Textbox'у
Есть таблица с полями Key Фамилия Имя Отчество key-типа счетчик int При нажатии...

Получение ключевого поля только что добавленной записи
Здравствуйте! Имеется следующий код (MS SQL Server 2008) Поле id_data это поле с автоприращением....

16
6029 / 3436 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.07.2011, 12:15 2
Цитата Сообщение от the MIKron Посмотреть сообщение
Вопрос: каким образом мне будет лучше обновлять содержимое таблицы без ключевого поля содержимым dataGridView?
необходимо запрос для adapter.UpdateCommand составить вручную
0
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
25.07.2011, 12:35  [ТС] 3
nio, синтаксис как у стандартного SQL запроса? Или не совсем?
0
6029 / 3436 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.07.2011, 12:40 4
the MIKron, полностью стандартный
1
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
27.07.2011, 09:01  [ТС] 5
Однако, я немного поспешил радоваться. Следующим кодом вручную генерирую UpdateCommand и обновляю таблицу:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
            try
            {
                this.dataGridView.CancelEdit();
                this.dataGridView.ClearSelection();
                           
                OleDbCommand command = new OleDbCommand() ;
 
                string scheme = "";
                for (int i = 0; i <= dataGridView.ColumnCount - 1; i++)
                {
                    scheme += "`"+dataGridView.Columns[i].Name + "` = ?,";
                    command.Parameters.Add(dataGridView.Columns[i].Name, OleDbType.Char, 50, dataGridView.Columns[i].Name);
                }
                command = new OleDbCommand("UPDATE `" + this.Text + "` SET " + scheme.Remove(scheme.Length - 1) + " WHERE `" + dataGridView.Columns[0].Name + "` = ?", connect);
                adapter.UpdateCommand = command;
 
                    
                adapter.Update(dataGridView.DataSource as DataTable);
                (dataGridView.DataSource as DataTable).AcceptChanges();
                MessageBox.Show("Изменения успешны!");
            }
            catch (OleDbException exp)
            { MessageBox.Show(exp.Message); }
Однако все мои попытки исполнить этот код приводят к исключению - "отсутствует значение для одного или нескольких требуемых параметров". О каких параметрах может идти речь?
0
748 / 547 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
27.07.2011, 09:36 6
C#
1
command = new OleDbCommand("UPDATE `" + this.Text + "` SET " + scheme.Remove(scheme.Length - 1) + " WHERE `" + dataGridView.Columns[0].Name + "` = ?", connect);
А строка запроса точно правильно формируется?
Должно быть так по структуре:
C#
1
command = new OleDbCommand("UPDATE `Таблица` SET `Имя поля`=значение", connect);
0
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
27.07.2011, 14:27  [ТС] 7
Вроде бы да, в моем случае:
SQL
1
UPDATE `Table` SET `Field` = ?
Поскольку на MSDN используются знаки вопроса, то и для построения запроса использовал их. Я так понял это указатель на данные, используемые адаптером.
0
6029 / 3436 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
27.07.2011, 16:07 8
the MIKron, что бы проверить правильность запроса, нужно знать, какая СУБД используется. Например, с точки зрения SQLServer запрос составлен неверно.
0
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
28.07.2011, 04:34  [ТС] 9
Вроде бы, с точки зрения SQL Jet (Access) запрос составлен правильно.
0
6029 / 3436 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
28.07.2011, 13:56 10
the MIKron, рекомендации:
Проверяешь, какой запрос у тебя получается в итоговой строке.
Проверяешь, выполненение простого строкового запроса (без сборки с контролов)
Постепенно добавляешь контролы в запрос и смотришь, где глюкает
0
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
08.08.2011, 13:59  [ТС] 11
В общем, именно обновление реализовать мне не удалось. Ибо даже если обновлять, то без ключевого поля выйдет что заменятся все строки, где будут совпадать значения обновляемого столбца (а такое у меня встречается). Поэтому пришлось применять решение от которого меня тошнит, но другого я не придумал:

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
try
            {
                OleDbConnection connect = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source = '" + cDB + "'");
                connect.Open();
                OleDbDataAdapter adapter = new OleDbDataAdapter();
                Form.TableData.CancelEdit();
                Form.TableData.ClearSelection();
                OleDbCommand command = new OleDbCommand();
 
                command = new OleDbCommand("DELETE FROM `" + Info[0] + "`", connect);
                command.ExecuteNonQuery();
 
                for (int i = 0; i <= Form.TableData.Rows.Count - 2; i++)
                {
                    string scheme = "";
                    for (int j = 0; j <= Form.TableData.ColumnCount - 1; j++)
                    { scheme += Form.TableData.Rows[i].Cells[j].Value.ToString() + ","; }
                    command = new OleDbCommand("INSERT INTO `" + Info[0] + "` VALUES(" + scheme.Remove(scheme.Length - 1) + ")", connect);
                    command.ExecuteNonQuery();
                }
                
                MessageBox.Show(Common.MessageAcceptSucces);
            }
            catch (OleDbException exp)
            { MessageBox.Show(exp.Message); }
1. Удаляем все существующие записи в таблице.
2. Вставляем текущее содержимое GridView.

Решение безобразное, но другое увы вряд ли существует.
0
6029 / 3436 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.08.2011, 14:04 12
Цитата Сообщение от the MIKron Посмотреть сообщение
1. Удаляем все существующие записи в таблице.
2. Вставляем текущее содержимое GridView.
Быдлокод
Цитата Сообщение от the MIKron Посмотреть сообщение
но другое увы вряд ли существует
А ввести ключевые поля никак?
0
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
08.08.2011, 14:06  [ТС] 13
Увы-увы. Ключевые поля принесут еще больше мороки.
0
6029 / 3436 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.08.2011, 20:12 14
the MIKron, категорически не согласен, как раз-таки они приносят упрощение и упорядоченность
0
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
09.08.2011, 03:59  [ТС] 15
Конечно. Но я работаю с декартовыми произведениями и другими логическими операциями над множествами, которые представлены в виде таблиц. Поэтому одно "лишнее" поле в таблице может породить десять в результате. Я думал над вариантом сделать "невидимое" ключевое поле, которое не будет отображаться и учитываться при вычислениях, но это достаточно большой объем работы, который если я и проделаю то уже на последних этапах работы.
0
6029 / 3436 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
09.08.2011, 08:11 16
Цитата Сообщение от the MIKron Посмотреть сообщение
одно "лишнее" поле в таблице может породить десять в результате
ты не представляешь сколько гемороя тебе принесет отсутствие этого поля
Цитата Сообщение от the MIKron Посмотреть сообщение
думал над вариантом сделать "невидимое" ключевое поле
нужно развивать и воплощать эту мысль, потому что она правильная
Цитата Сообщение от the MIKron Посмотреть сообщение
это достаточно большой объем работы, который если я и проделаю то уже на последних этапах работы
Переделывать в конце базу, а соответсвенно переписывать все приложение под новую базу, это объем в разы больший.

Не по теме:

Больше переубеждать не буду, читай подпись.

0
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
09.08.2011, 08:12  [ТС] 17
Буду думать и размышлять. Спасибо большое за потраченное на меня время.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2011, 08:12

Определение значения ключевого поля, неотображаемого в dataGridView, по выбранной строке
Здравствуйте, недавно начал заниматься как C#, так и sqlite. Много вопросов смог решить с помощью...

Как при создании записи узнать номер ее ключевого поля
Здравствуйте, мне бы хотелось узнать, как после выполнения sql-запроса для создания новой записи в...

Как реализовать UpdateCommand, если в таблице нет ключевого поля?
Пишу программу, которая должна открывать выбранную БД, заливать одну из её таблиц в DataGridView и...

Получение значения ключевого поля после выполнения команды TableAdapter.Insert()
Использую типизированный датасет в котором заданы DataTable и TableAdapter к ним. Не могу понять...


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

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

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