На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Profi, juice
  
> Вопросы про SQLite+DataGridView
    Привет всем.
    Есть ряд вопросов по этой связке.

    БД простая, как 3 копейки - 3 таблицы:
    1. Клиенты - серийный номер изделия, имя клиента, телефон и т.п. чепуха
    2. Ремонты - дата ремонта, тип ремонта (id ремонта из справочника), ФИО мастера, стоимость ремонта
    3. Справочник типа ремонта - название вида работы, цена.

    В каждой таблице есть id - primary key, в таблице ремонтов также есть id_client - foreign key - ссылка на таблицу клиентов.
    Типовая структура для таких задачек.

    Приложение C#, WinForms, NET4.0. Заказчику всё равно, а WPF я чего-то не понимаю, возможно плохо изучил, не пошло оно мне.
    Содержимое таблиц показываю в 2-х разных формах - клиенты и ремонты. 3-я форма - редактирование справочника, ничего интересного.
    Вся эта кухня уже крутится, работает нормально. Но есть одна странность.

    В таблице ремонтов поле тип ремонта - столбец Combobox, работу с ним взял отсюда - https://khanrahim.wordpress.com/2010/04/13/...agridview-in-c/
    Но если я поменяю в каком-то ремонте тип (просто выбираю другое значение их списка) событие CellValueChanged приходит, там я разблокирую кнопку "Сохранить". Но она ничего не сохраняет. Но если изменить в этой же строке ещё что-то, например, имя мастера, то всё сохраняется - и новое значение списка и фамилия.
    Кнопка сохранить делает по сути repairs_adapter.Update(repairs_dt); -- как во всех букварях.

    Сильно подозреваю, что дело в командах InsertCommand, UpdateCommand. Там по сути
    ExpandedWrap disabled
                      string s_query = string.Format(@"SELECT * FROM repairs WHERE repairs.id_client = {0}", id_client_for_repair);
                      //                string s_query = string.Format(@"SELECT repairs.date, repairs.id_repair_type, repairs.repair_note, repairs.master_fio, repairs.summa
                      //                                FROM repairs WHERE repairs.id_client = {0}", id_client);
                      repairs_adapter = new SQLiteDataAdapter(s_query, m_dbConn);
       
                      SQLiteCommandBuilder cb = new SQLiteCommandBuilder(repairs_adapter);
                      repairs_adapter.UpdateCommand = cb.GetUpdateCommand();
                      repairs_adapter.InsertCommand = cb.GetInsertCommand();
                      repairs_adapter.DeleteCommand = cb.GetDeleteCommand();


    Я смотрел, что пишется, например, в UpdateCommand:
    ExpandedWrap disabled
      "UPDATE [main].[sqlite_default_schema].[repairs] SET [id_client] = @param1, [date] = @param2, [id_repair_type] = @param3, [repair_note] = @param4, [master_fio] = @param5, [summa] = @param6 WHERE (([id_repair] = @param7) AND ([id_client] = @param8) AND ([date] = @param9) AND ([id_repair_type] = @param10) AND ((@param11 = 1 AND [repair_note] IS NULL) OR ([repair_note] = @param12)) AND ([master_fio] = @param13) AND ((@param14 = 1 AND [summa] IS NULL) OR ([summa] = @param15)))"


    Как понять, что оно передаёт по факту в эти @paramXX?
    id_repair - это primary key, т.е. все остальные условия в WHERE нафиг никому не нужны. Но как дать ему это понять? Я видел примеры ручного задания этих команд, но все они были какими-то огрызками непонятно от чего.

    на id_client база вообще ругалась, вынужден был загнать костыль
    ExpandedWrap disabled
                      foreach (DataGridViewRow row in dataGridViewRepairs.Rows)
                      {
                          row.Cells[1].Value = id_client_for_repair.ToString();
                      } // foreach

    перед repairs_adapter.Update(repairs_dt);

    Есть ли где-то какие-то внятные примеры, как всё это делать?
    Примеры по SQL Server - туфта полная, там все эти InsertCommand никто никогда не заполняет, работает и так. С SQLite - надо заполнять.

    Спасибо.
      Тема неактульна.

      От SQLite отказался по причине того, что Datetime у него, мягко говоря, странный. Из-за этого возникали какие-то странные баги с условиями на дату, были сложности с использованием DateTime контрола внутри DataGridView и т.д.
      Где-то даже читал, что нативно в SQLite есть только 3 типа данных - int, float/double и string. Всё остальное - какие-то ассоциированные типы. Как по мне - просто плохо сработанные костыли имхо. Даже встроенные функции работы с датой/временем со столбцами не работают, только с какими-то константами. Нафига они тогда? Калькулятор для даты/времены писать только ...

      Может я чего не понял, но переделал на MySQL - все баги и приколы как корова языком.

      С кастомными запросами (уже на MySQL) разобрался, всё пашет шикарно.

      Осталась некая кривизна с Combobox column в DataGridView, событие SelectedIndexChanged иногда приводит к побочным эффектам, но это удалось обойти другим событием.
      Сообщение отредактировано: hd44780 -
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script Execution time: 0,0609 ]   [ 15 queries used ]   [ Generated: 20.10.20, 17:32 GMT ]