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

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

23.07.2011, 10:09. Показов 4008. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.07.2011, 10:09
Ответы с готовыми решениями:

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

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

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

16
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.07.2011, 12:15
Цитата Сообщение от the MIKron Посмотреть сообщение
Вопрос: каким образом мне будет лучше обновлять содержимое таблицы без ключевого поля содержимым dataGridView?
необходимо запрос для adapter.UpdateCommand составить вручную
0
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
25.07.2011, 12:35  [ТС]
nio, синтаксис как у стандартного SQL запроса? Или не совсем?
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.07.2011, 12:40
the MIKron, полностью стандартный
1
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
27.07.2011, 09:01  [ТС]
Однако, я немного поспешил радоваться. Следующим кодом вручную генерирую 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
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
27.07.2011, 09:36
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  [ТС]
Вроде бы да, в моем случае:
SQL
1
UPDATE `Table` SET `Field` = ?
Поскольку на MSDN используются знаки вопроса, то и для построения запроса использовал их. Я так понял это указатель на данные, используемые адаптером.
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
27.07.2011, 16:07
the MIKron, что бы проверить правильность запроса, нужно знать, какая СУБД используется. Например, с точки зрения SQLServer запрос составлен неверно.
0
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
28.07.2011, 04:34  [ТС]
Вроде бы, с точки зрения SQL Jet (Access) запрос составлен правильно.
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
28.07.2011, 13:56
the MIKron, рекомендации:
Проверяешь, какой запрос у тебя получается в итоговой строке.
Проверяешь, выполненение простого строкового запроса (без сборки с контролов)
Постепенно добавляешь контролы в запрос и смотришь, где глюкает
0
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
08.08.2011, 13:59  [ТС]
В общем, именно обновление реализовать мне не удалось. Ибо даже если обновлять, то без ключевого поля выйдет что заменятся все строки, где будут совпадать значения обновляемого столбца (а такое у меня встречается). Поэтому пришлось применять решение от которого меня тошнит, но другого я не придумал:

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

Не по теме:

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

0
1 / 1 / 0
Регистрация: 13.07.2011
Сообщений: 44
09.08.2011, 08:12  [ТС]
Буду думать и размышлять. Спасибо большое за потраченное на меня время.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2011, 08:12
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru