
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.200.112.172] |
![]() |
|
Сообщ.
#1
,
|
|
|
Привет всем.
Есть ряд вопросов по этой связке. БД простая, как 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. Там по сути ![]() ![]() 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: ![]() ![]() "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 база вообще ругалась, вынужден был загнать костыль ![]() ![]() 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 - надо заполнять. Спасибо. |
Сообщ.
#2
,
|
|
|
Тема неактульна.
От SQLite отказался по причине того, что Datetime у него, мягко говоря, странный. Из-за этого возникали какие-то странные баги с условиями на дату, были сложности с использованием DateTime контрола внутри DataGridView и т.д. Где-то даже читал, что нативно в SQLite есть только 3 типа данных - int, float/double и string. Всё остальное - какие-то ассоциированные типы. Как по мне - просто плохо сработанные костыли имхо. Даже встроенные функции работы с датой/временем со столбцами не работают, только с какими-то константами. Нафига они тогда? Калькулятор для даты/времены писать только ... Может я чего не понял, но переделал на MySQL - все баги и приколы как корова языком. С кастомными запросами (уже на MySQL) разобрался, всё пашет шикарно. Осталась некая кривизна с Combobox column в DataGridView, событие SelectedIndexChanged иногда приводит к побочным эффектам, но это удалось обойти другим событием. |