Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2017, 10:22   #1
Grinvel
Пользователь
 
Регистрация: 25.09.2017
Сообщений: 16
По умолчанию И снова проблема с запросами (запрос 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, 12:26   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
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 в 12:30.
evg_m на форуме Ответить с цитированием
Старый 25.10.2017, 09:33   #3
Grinvel
Пользователь
 
Регистрация: 25.09.2017
Сообщений: 16
По умолчанию

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

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

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

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


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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с запросами haitkulova Microsoft Office Access 0 10.05.2015 19: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 22:40