Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 24.10.2017, 11:22   #1
Grinvel
Пользователь
 
Регистрация: 25.09.2017
Сообщений: 16
Репутация: 10
По умолчанию И снова проблема с запросами (запрос Update)

Работаю с базой данных Access. После некоторых вычислений в DataGridView нужно сохранить данные в базе данных. Использовал запрос UPDATE к БД, но изменения не сохранились.

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

private void CompKIZHM_Click(object sender, EventArgs e)
        {
            CommandText = "SELECT * from Table1 Where ([Количество] <> @test and [Количество] is not NULL and ([Общий чёрный вес] is NULL or [Общий жидкий вес] is NULL))";
            bdParam.Add("@test", "0");
            Connect(CommandText, bdParam);
            bdParam.Clear();
            CommandText = "UPDATE Table1 Set [Общий чёрный вес] = @AllBlackHeight, [Общий жидкий вес] = @AllFluidHeight Where [Обозначение детали] = @NameDetail";
            float temp1, temp2;
            for (int i = 0; i < GridMainBD.Rows.Count - 1; i++)
            {
                temp1 = Convert.ToSingle(GridMainBD.Rows[i].Cells[4].Value.ToString()) * Convert.ToSingle(GridMainBD.Rows[i].Cells[6].Value.ToString());
                temp2 = Convert.ToSingle(GridMainBD.Rows[i].Cells[5].Value.ToString()) * Convert.ToSingle(GridMainBD.Rows[i].Cells[6].Value.ToString());
                bdParam.Add("@NameDetail", GridMainBD.Rows[i].Cells[1].Value.ToString());
                bdParam.Add("@AllBlackHeight", Convert.ToString(temp1));
                bdParam.Add("@AllFluidHeight", Convert.ToString(temp2));
                Connect(CommandText, bdParam);
                bdParam.Clear();
            }

Процедура обработки запросов
Код:

private void Connect(string CommText, Dictionary<string, string> bdParam)
        {
            CommandText = CommText;
            OleDbConnection conn = new OleDbConnection(ConnectionString);   //подключение к БД
            conn.Open();
            OleDbCommand MyCommand = new OleDbCommand();                    //объект для выполнения запросов
            MyCommand.Connection = conn;
            MyCommand.CommandText = CommandText;
            foreach (var param in bdParam)
            {
                MyCommand.Parameters.AddWithValue(param.Key, param.Value);
            }
            OleDbDataAdapter dataAdapter = new OleDbDataAdapter();          //взаимодействие между DataSet и источником данных
            if (CommandText.Contains("UPDATE"))
            {
                dataAdapter.UpdateCommand = MyCommand;
                MyCommand.ExecuteNonQuery();
            }
            else
            {
                dataAdapter.SelectCommand = MyCommand;
                DataSet ds = new DataSet();                                     //образ БД
                dataAdapter.Fill(ds);
                GridMainBD.DataSource = ds.Tables[0].DefaultView;               //привязка к таблице на форме
            }
            conn.Close();
        }

Подскажите, пожалуйста, что не так. Или как ещё можно сохранить изменённые (добавленные) данные в БД?
Grinvel вне форума   Ответить с цитированием
Старый 24.10.2017, 13:26   #2
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,741
Репутация: 2097
По умолчанию

Код:

UPDATE Table1 Set [Общий чёрный вес] = <ПОЛЕ количества> * <ПОЛЕ удельного черного веса???>@AllBlackHeight, 
[Общий жидкий вес] = <ПОЛЕ количества> * <ПОЛЕ удельного жидкого веса???>@AllFluidHeight
 Where [Обозначение детали] = @NameDetail
[Количество] <> @test and [Количество] is not NULL and ([Общий чёрный вес] is NULL or [Общий жидкий вес] is NULL)

и НИКАКОГО цикла

а хранить в БД и введеную(исходную) величину [количество]
и расчитываемую на ее основе [общий вес]
не есть хорошо. чревато ошибками расчетов.
достаточно "забыть стереть" общий вес после ЛЮБОГО исправления "исходных" данных(количество/удельный вес) и ВСЕ! общий вес будет неверным!!!
Цитата:
Код:

[Общий жидкий вес] is NULL

Код:

SELECT *,  
[количество]*[удельный черный вес] as [общий черный вес], 
[количество]*[удельный жидкий вес] as [общий жидкий вес] 
from Table1 Where ([Количество] <> @test and [Количество] is not NULL 
and ([Общий чёрный вес] is NULL or [Общий жидкий вес] is NULL))

__________________
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 24.10.2017 в 13:30.
evg_m вне форума   Ответить с цитированием
Старый 25.10.2017, 10:33   #3
Grinvel
Пользователь
 
Регистрация: 25.09.2017
Сообщений: 16
Репутация: 10
По умолчанию

Не совсем понимаю, как в этом случае будет происходить заполнение в нужные ячейки. У меня была выборка тех записей бд, которые нужно обновить (вычислить и записать общие чёрные и жидкие веса), а затем циклом построчно выполнялись данные действия. Если убрать цикл, то как реализовать данный алгоритм? И каким образом он будет находить нужные поля?
По поводу ошибок расчётов: удельные веса являются константами и никогда не меняются, меняется лишь количество, но при изменении количества у любой записи весь алгоритм дальнейших вычислений будет отрабатываться заново, т.к. ввод количества является первоначальным этапом, от которого отталкивается вся дальнейшая работа
Grinvel вне форума   Ответить с цитированием
Старый 25.10.2017, 11:02   #4
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,741
Репутация: 2097
По умолчанию

Цитата:
Не совсем понимаю, как в этом случае будет происходить заполнение в нужные ячейки.
общий вес НЕ НАДО хранить. и не надо будет обновлять.
Его всегда (по необходимости) надо РАСЧИТЫВАТЬ. (смотри последний пример).
расчет может быть использован и в критериях отбора (WHERE) данных.

Цитата:
Если убрать цикл, то как реализовать данный алгоритм?
первый запрос обновит ВСЕ записи "требующие" обновления. (те которые у тебя были отобраны) и в соответствии с данными каждой конкретной записи.

Цитата:
удельные веса являются константами и никогда не меняются
тогда удельные веса как поле не нужно, а использовать ЧИСЛА.


Мартин Грубер. Понимание SQL. ==== Азбука
__________________
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 25.10.2017 в 11:05.
evg_m вне форума   Ответить с цитированием
Старый 25.10.2017, 11:27   #5
Grinvel
Пользователь
 
Регистрация: 25.09.2017
Сообщений: 16
Репутация: 10
По умолчанию

всё, разобрался, спасибо за помощь
Grinvel вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с запросами haitkulova Microsoft Office Access 0 10.05.2015 20:42
Проблема с запросами! thooog Microsoft Office Access 0 20.05.2013 21:03
Запрос UPDATE Solyanik SQL, базы данных 4 12.02.2013 22:15
Работа с SQL запросами INSERT, UPDATE, DELETE в DataGridView SERG1990 Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 15.12.2012 13:46
Запрос с update zolomar Microsoft Office Access 3 25.01.2011 23:40


16:11.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


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