|
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
|
|||||||||||
Дублирование кода SQLite DataAdapter08.04.2025, 18:57. Показов 1954. Ответов 16
Метки нет (Все метки)
Всем привет
Пытаюсь избежать дублирования кода. У меня есть универсальный метод, который открывает подключение к БД
Раньше я вызывал его только один раз, и всё было хорошо. Создал новый метод, где мне пришлось к этому прибегнуть дважды.
0
|
|||||||||||
| 08.04.2025, 18:57 | |
|
Ответы с готовыми решениями:
16
Code First - выбор: Microsoft.EntityFrameworkCore.Sqlite, Microsoft.Data.Sqlite, System.Data.SQLite и др. проблема с DataAdapter.Update Обновление базы данных dataadapter.Update |
|
|
||||||
| 09.04.2025, 08:33 | ||||||
|
Просто засуньте всё в один делегат.
Не по теме: С виду архитектура конечно тот ещё треш. Хотя для диплома наверное сгодиться, балов на 4 из 5.
0
|
||||||
|
|
|||||||||||||
| 09.04.2025, 08:48 | |||||||||||||
|
jkom-18rus, Если мне не изменяет память, то метод Fill() сам открывает и закрывает соединение.
Ну да, так и есть
jkom-18rus, Вот пример работы с Command, без адаптера. Тут тоже самое, объекты создаются и закрываются там где нужно
0
|
|||||||||||||
| 09.04.2025, 10:26 | |
|
0
|
|
|
|
||
| 09.04.2025, 10:30 | ||
|
Не по теме: Не, мне было нужно количество подчинённых записей, вот и получаю его
0
|
||
|
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
|
|||||||||||||
| 09.04.2025, 18:04 [ТС] | |||||||||||||
![]() В чём треш? Я просто не грамотный. Как лучше сделать? Добавлено через 32 минуты ExecuteWithDataAdapter(idQuery, adapter => Ошибка CS0103 Имя "ExecuteWithDataAdapter" не существует в текущем контексте. Написал с маленькой буквы - Ошибка CS0103 Имя "countTable" не существует в текущем контексте.
private int GetContractCountByName(string tableName, string selectedItem) лежит в отдельном классе GetReport.cs private void ExecuteWithDataAdapter(string query, Action<SQLiteDataAdapter> action) лежит в классе формы в классе формы объявляю GetReport.cs
0
|
|||||||||||||
|
|
|||||||||
| 09.04.2025, 20:08 | |||||||||
|
2. класс отвечающий за реализацию взаимодействия в БД должен декларировать в контракте либо dto, либо явные логические значения без привязки к реализации. Т.е. нельзя писать "дай максимальное значение из таблицы А", нужно либо для таблицы А делать отдельный класс, либо делать общую реализацию через <T> Это два основных пункта, которые я бы при проверке курсовой отметил. Возможно приймут и такое на ура, по сути всё зависит от проверяющего (порой и идеально правильный код заворачивают, потому что препод не шарит материал). А так улучшать можно до бесконечности. чисто-ля-ля
Опуская идею с ORM например можно вынести названия БД в константы (а ещё лучше в статические readonly) значения, и реализовать общий метод через Command нечто такое
Переиспользуйте ExecuteWithDataAdapter, раз не можете написать сложный делегат. Сильно хуже не будет, в реальных приложениях вообще работают с orm и пулом соединений, так что текущий вариант реализации с вызовом ExecuteWithDataAdapter несколько раз конкретно для вашей практики сойдет.
0
|
|||||||||
|
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
|
||||||||||||
| 27.04.2025, 17:42 [ТС] | ||||||||||||
|
Всем привет.
Прошу прощения, что так долго пропадал. Доделывал остальной функционал своей проги. private int GetContractCountByName(string АЗС или Автобаза, string Название данной АЗС/базы) Параметры мы получаем из элементов на форме. АЗС или автобаза - radioButton, название - comboBox. 2 пункт вообще не понял. Заочное обучение оно такое... По теме. Проблему решил. Просто сделал из двух моих запросов один запрос с подзапросом.
0
|
||||||||||||
|
|
|||
| 27.04.2025, 21:28 | |||
|
Не по теме:
Просто на будущее: если вы в метод для запроса передаете имя таблицы -- это явный признак что делаете неправильно. Бизнеслогика никогда не оперирует именами таблиц, более того -- она даже не знает о существовании таблиц. Для этого либо вводят enum (если количество типов статично или правится ооооочень редко и сопровождается полной правкой кода), либо вообще оперируют Data Transfer Object (DTO), которые эти типы и описывают. Как можно было бы сделать вам: - таблица "тип поставщика". Скажем ID + Name. В ней две записи "1 - АЗС", "2 - нефтебаза" - таблица "поставщик". В ней тоже ID, имя, и FK на "тип поставщика" - если для АЗС нужно добавить в "поставщики" специфическую инфу, которая не свойственная остальным поставщикам, делают дополнительную таблицу "АЗС поставщик" которая связана с "поставщик" по ID один-к-одному и имеет эти самые доп-поля. Это можно проворачивать для всех остальных типов - когда вы хотите получить количество контрактов по определённому типу поставщика, вы передаете ID этого типа в метод. Такая схема позволяет написать более универсальный фильтр запросов, безболезненно расширяться как по типам, так и по количеству, а также вводить специфические моменты для определённых типов записей. Таже при написании кода вы не вспоминаете строковое значение из таблицы, т.к. практически всегда у вас тянуться либо enum, либо ID и что главное -- сложнее сделать опечатку, которую пропустит компилятор (например "АЗС", "AЗC" и "AЗС" -- три совершенно разных значения и исполняемому коду совершенно пофиг что они выглядят одинаково. Про верхний/нижний регистр вообще молчу).
0
|
|||
|
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
|
|
| 28.04.2025, 17:45 [ТС] | |
|
Wolfdp, интересная информация
Вот так сразу сложно в понимании. Надеюсь понял хоть что-то, хотя бы основную мысль. Не знаю чему так учат на очке. У нас на парах преподаватель ничего по делу не рассказывал. Сам сидел и разбирался, как программировать. Но не по нашим заданиям, а что-то другое.
0
|
|
|
|
|
| 29.04.2025, 08:41 | |
|
jkom-18rus, Почитайте про нормальные формы таблиц СУБД (нормализация данных), много интересного узнаете. И если работаете с СУБД, то разберитесь с её диалектом SQL, научитесь писать правильные запросы, создавать правильные индексы, связи и т.д.
0
|
|
|
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,299
|
|||||||||||
| 11.05.2025, 02:41 | |||||||||||
|
jkom-18rus, я тебе настоятельно рекомендую забыть про
DataTable и SqlDataAdapter. Это пережитки отдалённого прошлого. И проблема с этими классами не в том, что это не "модно-молодёжно", а в том, что это не удобно. DataTable не типизированный. Глядя на код ты не можешь сказать сколько колонок оно содержит и каких они типов. Везде, где тебе к DT обратиться захочется, тебе придётся писать такую ахинею:
Чтобы вытащить ОДНО значение из базы можно использовать такой метод:
0
|
|||||||||||
|
|
|||||||
| 12.05.2025, 09:29 | |||||||
0
|
|||||||
|
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,299
|
|
| 12.05.2025, 11:01 | |
|
Andrey-MSK, ты понял о чём я) Одно дело - класс со свойствами, где в коде всё видно. Другое дело DataTable, который в рантайме компонуется не пойми как.
С таким успехом можно и Dictionary<string, (object, Type)> назвать типизированным потому, что ему по ключу экземпляр типа передаётся.
1
|
|
|
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
|
||
| 12.05.2025, 17:40 [ТС] | ||
|
Хватит с меня этого программирования
0
|
||
|
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,299
|
|||
| 13.05.2025, 01:59 | |||
|
0
|
|||
| 13.05.2025, 01:59 | |
|
Помогаю со студенческими работами здесь
17
Удаление записей(DataAdapter) Метод Fill у DataAdapter. Как с ним работать? потеряный DataAdapter Обновление источников данных с п о м о щ ь ю объектов DataAdapter Как вы делаете Update данных в БД (при использовании DataGridView, DataSet, DataAdapter) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|