|
0 / 0 / 0
Регистрация: 03.10.2024
Сообщений: 6
|
||||||
Преобразование переменной типа object, разработка универсального метода для работы с бд03.10.2024, 19:32. Показов 728. Ответов 3
Все доброго времени суток!
Пишу программу на C# (windows Form). Программа должна работать с БД. Пытаюсь сделать универсальные методы, принимающий в качестве параметров объекты типа object. Пользователь может из вне передать как string так и int. Подскажите, нужна ли здесь преобразование (явное) типов для "Par_1" и "Par_2" ? И как это лучше реализовать? параметр "st" не в счет. Внизу один из методов, которые планирую использовать для работы с БД
0
|
||||||
| 03.10.2024, 19:32 | |
|
Ответы с готовыми решениями:
3
Приведение переменной типа object к переменной производного типа в приложенном коде Разработка программы для работы с файлом без типа Разработка программы для работы с файлом без типа |
|
Нарушитель
110 / 86 / 32
Регистрация: 10.05.2023
Сообщений: 323
|
||||||
| 03.10.2024, 21:32 | ||||||
Сообщение было отмечено Mihail_Smmirnov как решение
Решение
В вашем методе
Zapr_Select явное преобразование типов для параметров Par_1 и Par_2 не требуется, так как метод AddWithValue класса SqlParameter автоматически определяет тип данных переданного объекта. Однако, если вы хотите более строго контролировать типы данных, можно использовать явное преобразование.
1
|
||||||
|
4 / 3 / 1
Регистрация: 26.06.2022
Сообщений: 18
|
||||||
| 04.10.2024, 00:02 | ||||||
|
Тут просто криком кричит разделение метода на несколько и использование полиморфизма. Нарушается принцип единой ответственности.
Я бы делал так:
1
|
||||||
|
|
|||||||||||||||||||||
| 04.10.2024, 14:30 | |||||||||||||||||||||
|
Ну, самое простое решение (если не считать всякие ORM), это явно указать методы которые строго будут принимать явно ожидаемый тип данных, а внутри уже использовать обобщенный универсальный метод. Делается это для следующего:
- "внешний" код явно будет знать какие данные нужно передать. Это очень облегчает и чтение, и использование, и сопровождение кода. - "внешний" код не сможет передать не валидные данные, т.к. метод подразумевает что нужно передать число/дату/строку, и запихнуть иное не получится чисто технически. - вопрос парсинга того что вводит юзер -- это исключительно UI забота. Уровень БД не должен ничего знать о том, в каком виде вводятся данные. Обобщеные методы выглядят так
Execute -- просто выполнение без ожидания возращаемых данных (такие как inser, update, delete)Execute<T> -- выполнение с вычиткой через SqlDataReader. Ожидает делегат, который будет каждую строку парсить в ожидаемый тип TОба метода ожидают набор ИмяПараметра+Значение в виде массива через params. В методе SetParameters просто проходим массив (если он есть) и записываем все значения в command.ParametersSqlCommand Init(string connectionString, string sql) -- тупо для избегания дублирования кода и одного места инициализации подключения (если вдруг нужно будет вносить правки, то только в один метод, а не несколько).Теперь как всё это добро использовать дальше. Допустим у нас есть таблица пользователей Users, в которой храниться логин, пароль, роль пользователя и скажем временная метка последнего изменения записи. Добавим класс для отображения данных.
- найти пользователя по логину и паролю - добавить нового пользователя
var sql = $""" -- как можно заметить, тут я напихал констатнт. Делается это для того чтобы нельзя было допустить опечатку в имени колонки. Также облегчает нахождение где она используется (в сопровождении кода это ппц как помогает, особенно когда нужно переименовать колонку в БД).Map -- локальный статический метод, который передается в качестве делегата для парсинга при вычитке. Т.к. он внутри другого метода, это "изолирует" его. В теории можно вынести в просто статический метод, если повторяется.Так как тот же метод Add явно ожидает конкретных параметров конкретного типа, дальше не будет проблемы с угадыванием "шо за чем передавать". В целом код "облегчается" в использовании до такой схемы: - добавили нужный метод - объявили переменные - написали sql - пнули нужный Execute - .... - PROFIT! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P.S. можно конечно написать "проще", вплоть до впихивание всего в условный ClickHandler. Правда с таким подходом чем больше пишешь, тем больнее становится. Данный пример -- минимальная попытка избежания боли в дальнейшем. P.P.S. В идеале стоит разобраться в какой-нибудь ORM и работать через неё.
2
|
|||||||||||||||||||||
| 04.10.2024, 14:30 | |
|
Помогаю со студенческими работами здесь
4
Преобразование object -> byte[] -> object для передачи по сети Вывод переменной типа object Преобразование типа функции (метода) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|