Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/16: Рейтинг темы: голосов - 16, средняя оценка - 5.00
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
WPF

Взаимодействие с базой данных в MVVM

16.05.2022, 20:31. Показов 3939. Ответов 37

Студворк — интернет-сервис помощи студентам
У меня есть класс, в котором реализована логика взаимодействия с БД, все таблицы хранятся в этой структуре в памяти. Этот класс инициализируется только один раз (сейчас в конструкторе App, у которого MyDataBase лежит как свойство с геттером и приватным сеттером). Как мне достать его из ViewModel и подгружать данные (в рамках MVVM)?

Да и в целом, буду благодарен любому примеру взаимодействия БД и ViewModel
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.05.2022, 20:31
Ответы с готовыми решениями:

Взаимодействие label с базой данных
Добрый день! Создаю приложение и появилась проблема. Есть форма авторизации, при правильном вводе данных переходит на следующую форму, где...

Взаимодействие баз данных с MVVM
Мне посоветовали завернуть роботу с базами в класс сервис и работать с ней через биндинги вьюшки, но дело в том что я не совсем понимаю что...

Программное взаимодействие с базой данных
Написать программу, которая осуществляет следующие манипуляции с таблицами базы данных (структуру базы данных взять из соответствующего...

37
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
18.05.2022, 10:10
Лучший ответ Сообщение было отмечено Harius как решение

Решение

Студворк — интернет-сервис помощи студентам
Harius, Поясню почему классы DataClasses - это плохое решение.
Один из принципов ООП - единственность функциональности.
Это означает, что объект, метод не должны "делать всё" - так называемые "методы Бога" не приветствуются.
Связанно это с тем, что такие объекты трудно модернизировать, поддерживать.

Вот сейчас у вас в этих классах реализована логика работы с файловой системой.
И если у нас изменится Хранилище, то придётся изменить все эти классы.
А так как эти классы используются во всех слоях вплоть до View, то их все тоже придётся как минимум перекомпилировать.

То есть в текущей реализации полностью отсутствует абстракция Хранилища и функционал по работе с ним размазался по всему приложению.

Должно быть так:
- Нужно изменить Хранилище - меняем только реализацию интерфейса Репозитория. Всё остальное приложение не должно затрагиваться;
- Даже если нужно изменить интерфейс Репозитория, то это должно затронуть только Модель.

Вам это не очень очевидно, поскольку ваше Решение практически реализовано в одном проекте.
А так не делается.
Для каждого слоя нужен свой проект.

Структура связей в WPF Решении
Структура WPF решения
Потоки в асинхронном MVVM
Структура WPF+БД решения
1
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
19.05.2022, 10:40  [ТС]
Элд Хасп, репозиторий должен содержать логику загрузки из БД?
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,755
Записей в блоге: 4
19.05.2022, 11:10
Цитата Сообщение от Harius Посмотреть сообщение
репозиторий должен содержать логику загрузки из БД?
Да, всю работу с БД.

Добавлено через 3 минуты
Нечто типа такого
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using DALibrary.DataAccess;
 
namespace DALibrary.Interfaces
{
    public interface IMainDA
    {
        EObjectDA EObjectDA { get; }
        GPlanDA GPlanDA { get; }
        ReportDA ReportDA { get; }
        DrawDA DrawDA { get; }
        DrawSysDA DrawSysDA { get; }
        DrawSpecDA DrawSpecDA { get; }
        ExcelDA ExcelDA { get; }
        SpecialDA SpecialDA { get; }
        LaborHBTypeDA LaborHBTypeDA { get; }
        LaborHBWorkDA LaborHBWorkDA { get; }
        ReportByDateDA ReportByDateDA { get; }
        ONZDataDA ONZDataDA { get; }
        MiMDA MiMDA { get; }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using DALibrary.DataAccess;
using DALibrary.Interfaces;
 
namespace DALibrary
{
    /// <summary>
    /// Класс предоставляет точку входа в библиотеку доступа к данным в БД.
    /// </summary>
    public sealed class MainDA : IMainDA
    {
        /// <summary>
        /// Объект доступа к БД с методами доступа к объектам строительства.
        /// </summary>
        public EObjectDA EObjectDA { get; }
 
        /// <summary>
        /// Объект доступа к БД с методами доступа к объектам генерального плана.
        /// </summary>
        public GPlanDA GPlanDA { get; }
 
        /// <summary>
        /// Объект доступа к БД с методами доступа к отчетам.
        /// </summary>
        public ReportDA ReportDA { get; }
 
        /// <summary>
        /// Объект доступа к БД с методами доступа к чертежам.
        /// </summary>
        public DrawDA DrawDA { get; }
 
        /// <summary>
        /// Объект доступа к БД с методами доступа к листам чертежа.
        /// </summary>
        public DrawSysDA DrawSysDA { get; }
 
        /// <summary>
        /// Объект доступа к БД с методами доступа к спецификации листа чертежа.
        /// </summary>
        public DrawSpecDA DrawSpecDA { get; }
 
        /// <summary>
        /// Объект доступа к БД с методами для работы с файлами Excel.
        /// </summary>
        public ExcelDA ExcelDA { get; }
 
        /// <summary>
        /// Объект доступа к БД со служебными методами.
        /// </summary>
        public SpecialDA SpecialDA { get; }
 
        /// <summary>
        /// Объект доступа к БД с методами для работы с типами работ в справочнике трудозатрат.
        /// </summary>
        public LaborHBTypeDA LaborHBTypeDA { get; }
 
        /// <summary>
        /// Объект доступа к БД с методами для работы с перечнем работ в справочнике трудозатрат.
        /// </summary>
        public LaborHBWorkDA LaborHBWorkDA { get; }
 
        /// <summary>
        /// Объект доступа к БД с методами для работы с очетами по фактическому выполнению.
        /// </summary>
        public ReportByDateDA ReportByDateDA { get; }
 
        /// <summary>
        /// Объект доступа к БД с методами для работы с очетами по НЗ.
        /// </summary>
        public ONZDataDA ONZDataDA { get; }
 
        /// <summary>
        /// Объект доступа к БД с методами для работы с очетами по технике.
        /// </summary>
        public MiMDA MiMDA { get; }
 
        public MainDA()
        {
            EObjectDA = new EObjectDA();
            GPlanDA = new GPlanDA();
            ReportDA = new ReportDA();
            DrawDA = new DrawDA();
            DrawSysDA = new DrawSysDA();
            DrawSpecDA = new DrawSpecDA();
            ExcelDA = new ExcelDA();
            SpecialDA = new SpecialDA();
            LaborHBTypeDA = new LaborHBTypeDA();
            LaborHBWorkDA = new LaborHBWorkDA();
            ReportByDateDA = new ReportByDateDA();
            ONZDataDA = new ONZDataDA();
            MiMDA = new MiMDA();
        }
    }
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
19.05.2022, 12:21
Цитата Сообщение от Harius Посмотреть сообщение
репозиторий должен содержать логику загрузки из БД?
Выше уже ответил Andrey-MSK.
Цель Репозитория - абстракция от Хранилища (в том числе от БД).
Если в Решении используется Репозиторий, то при изменении Хранилища (в вашем случае переходе от файловой системы к БД), кроме реализации Репозитория в Решении ничего меняться не должно.
А у вас логика работы с Хранилищем размазана по всем слоям - вплоть до View.
1
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
20.05.2022, 00:38  [ТС]
Элд Хасп, я реализовал слои Model и Repository в ветке feature/mvvm, не могли бы Вы глянуть, пожалуйста? Во View всё ещё очень много логики Model, постепенно убираю это и раскладываю на слои. Теперь самый большой вопрос - DTO. Как реализовать интерфейсы модели, которые будет подхватывать ViewModel?
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,755
Записей в блоге: 4
20.05.2022, 08:35
Цитата Сообщение от Harius Посмотреть сообщение
Как реализовать интерфейсы модели, которые будет подхватывать ViewModel?
Использовать IoC (DI). Интерфейс я вам выше показывал. И потом в BaseVM их просто подключить. Вот пример, у меня сделано на ServiceLocator
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
 
using DALibrary.Interfaces;
 
using Services;
using Services.Interfaces;
 
namespace VModels
{
    public class BaseViewModel : BaseINPC, IBaseViewModel
    {
        private readonly IBackgroundTaskQueue _taskQueue = ServiceLocator.Instance.GetService<IBackgroundTaskQueue>();
        // Ссылка на репозиторий
        private readonly IMainDA _mainDA = ServiceLocator.Instance.GetService<IMainDA>();
        private readonly Lazy<IWindowService> _windowService
            = new Lazy<IWindowService>(() => ServiceLocator.Instance.GetService<IWindowService>());
 
        protected IBackgroundTaskQueue TaskQueue => _taskQueue;
        protected IMainDA MainDA => _mainDA;
        protected IWindowService WindowService => _windowService.Value;
    }
}
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
20.05.2022, 10:35
Цитата Сообщение от Harius Посмотреть сообщение
не могли бы Вы глянуть
Глянул, но мало что понял.
1) В коллективном программировании, очень желательно добавлять нормальные XML-документирование.
Вот в интерфейсе IRepository, что должен делать каждый метод?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Collections.Generic;
 
namespace Repository
{
    public interface IRepository<T> : ISerializable
    {
        public string Name { get; }
        
        public abstract List<T> Find(Predicate<T> predicate);
 
        public abstract T GetOrPut(int id, T defaultValue);
 
        public abstract T GetOrDefault(int id);
 
        public abstract T GetOrThrow(int id);
 
        public abstract T Put(T value);
 
        public abstract List<T> ToList();
 
        public abstract Predicate<int> Has();
 
        public abstract Func<int, T> Get();
    }
}
2) Интерфейс IRepositoryProvider, возвращает репозиторий по имени.
Получается у вас с одним типом может работать несколько репозиториев?
Это очень не типично. И требует дополнительных объяснений.
Без них я не понимаю его назначения.

Так же непонятен метод SerializeToDisk().
Репозиторий абстрагирован от Хранилища и следовательно неизвестно будет ли для сохранения данных использоваться сериализация в файл или сохранение в БД.
Поэтому, как минимум, этот метод нужно переименовать в Save или SaveChanged.
C#
1
2
3
4
5
6
7
8
9
namespace Repository
{
    public interface IRepositoryProvider
    {
        public abstract IRepository<T> GetByName<T>(string tableName);
 
        public abstract void SerializeToDisk();
    }
}
3) Интерфейс ISerializable, тоже самое - должен быть отвязан (абстрагирован) от типа Хранилища.
C#
1
2
3
4
5
6
7
8
9
using System.IO;
 
namespace Repository
{
    public interface ISerializable
    {
        public abstract void Serialize(DirectoryInfo file);
    }
}
Добавлено через 11 минут
Цитата Сообщение от Harius Посмотреть сообщение
слои Model и Repository
Немного по самой концепции разделения.
Так как Репозиторий это абстракция от Хранилища, а его реализация уже завязана на определённый тип Хранилища, то, однозначно, интерфейсы Репозитория и его Реализации - это разные сборки (проекты).

Второй нюанс, Репозиторий работает с Моделью в типах Модели - без этого абстракцию построить не получиться.
Типы Модели - это могут быть типы общего применения (int, string, кортежи, кастомные DTO и т.д.) и, если Репозиторий "Дружественный", Бизнес-Сущности.

Теперь возникает вопрос, если эти типы объявлены на уровне Модели, но Репозиторий должен о них знать, а Модель должна знать о Репозитории, то где объявлять эти типы?
Если в Модели, то получится циклические ссылки - такое запрещено.
Поэтому все эти типы и интерфейс Репозитория должны объявлять в отдельной сборке уровня Модели.
На эту сборку будут иметь ссылку и Репозиторий (реализация интерфейса) и Модель.

Если делать абстрактную Модель, то для неё тоже должен объявляться интерфейс.
И он тоже будет в этой же сборке-библиотеке.

Добавлено через 19 минут
Цитата Сообщение от Harius Посмотреть сообщение
Теперь самый большой вопрос - DTO. Как реализовать интерфейсы модели, которые будет подхватывать ViewModel?
Посмотрел я внимательнее ваши классы - они могут быть Бизнес Сущностями, но для VM они плохо пригодны.
Основная проблема в вычислительных членах (свойствах и методах).

В этих классах нет INPC (и не должно быть) и если зависимости вычислений изменятся, то VM и View об этом никак не узнают.
Самое оптимальное для обмена с VM - это иммутабельные DTO: классы только со свойствами только для чтения.
Наравне с ними можно использовать структуры DTO, кортежи, записи.

И очень сложная структура классов - за полсотни, по моему.
Как-то упростить это нельзя?

Добавлено через 1 минуту
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Использовать IoC (DI).
До этого пока "как до Луны".
Гляньте само Решение на ГитХаб.
1
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
22.05.2022, 21:51  [ТС]
Элд Хасп, посмотрите теперь) Теперь можно и IoC затронуть)
Такой вопрос, в компаниях, где запрещён CB, запрещены и DP?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
22.05.2022, 23:37
Цитата Сообщение от Harius Посмотреть сообщение
где запрещён CB, запрещены и DP?
Нет.
Но DP-свойства добавляются в CustomControl.
А уже из них делаются представления с XAML контентом.

Добавлено через 27 секунд
Это типовой подход.
Таким же образом созданы все дефолтные элементы.

Добавлено через 1 минуту
С CustomControl почти всегда отдельно ещё идёт Шаблон для темы по умолчанию.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
24.05.2022, 14:33
Цитата Сообщение от Harius Посмотреть сообщение
я реализовал слои Model и Repository в ветке feature/mvvm, не могли бы Вы глянуть, пожалуйста?
Совсем забыл про это.
Увидел вашу новую тему и только тогда вспомнил.
Если долго не отвечаю - не стесняйтесь напоминать.

Добавлено через 33 минуты
Harius, не совсем понимаю вот эту часть:
C#
23
24
25
26
27
28
29
30
31
32
33
34
35
36
        public MainModel(IRepositoryManager manager)
        {
            _manager = manager;
 
            Clients = _manager.RegisterRepository<Client.Client>("Clients");
 
            Contracts = _manager.RegisterRepository<Contract.Contract>("Contracts");
 
            Documents = _manager.RegisterRepository<AbstractDocument>("Documents");
 
            Employees = _manager.RegisterRepository<Employee.Employee>("Employees");
 
            Tasks = _manager.RegisterRepository<Task.Task>("Tasks");
        }
Зачем у вас при получении репозитория задаётся его тип и имя?
Разве для одного типа может быть несколько репозиториев?
0
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
24.05.2022, 16:06  [ТС]
Элд Хасп, да, для одного типа может быть несколько репозиториев
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
24.05.2022, 16:19
Цитата Сообщение от Harius Посмотреть сообщение
для одного типа может быть несколько репозиториев
А вот из вшей реализации MainModel, вроде, следует обратное.
Объясните где ещё используются эти репозитории для тех же типов, но с другим именем.

Добавлено через 1 минуту
По идее вы должны создать отражение табличной структуры в MainModel.
Каждая таблица отражается через свой тип сущности.
Откуда берутся другие таблицы с этим же типом?
0
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
24.05.2022, 18:53  [ТС]
Элд Хасп, да, я ошибся, двух таблиц с одним типом быть не может
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
24.05.2022, 19:13
Цитата Сообщение от Harius Посмотреть сообщение
двух таблиц с одним типом быть не может
Соответственно упрощается IRepository<T> в нём не нужен Name.
В IRepositoryManager меняется сигнатура метода: public IRepository<T> RegisterRepository<T>();.

Добавлено через 7 минут
Далее давайте сначала разберёмся со связями между таблицами: Clients, Contracts, Documents, Employees, Tasks.
А то у мне трудно разобраться по коду.

Добавлено через 2 минуты
DocumentInfo, DocumenBody, Money много где используется, но для них нет таблицы.
0
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
24.05.2022, 19:17  [ТС]
Элд Хасп, всё, кроме того, для чего есть репозитории, являются вложенными классами, которые не могут существовать отдельно от своих владельцев
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
24.05.2022, 19:30
Цитата Сообщение от Harius Посмотреть сообщение
которые не могут существовать отдельно от своих владельцев
То есть для View достаточно вот этих пяти типов из таблиц MainModel?

Нигде в этих типах нет INPC (и не должно быть).
Может ли происходить изменение данных не из GUI (View)?
Если изменяется какоое-то "вложенное" значение, как это изменение будет прокидываться в View?

Например в типе DesignProject:
C#
21
22
        public Money.Money MoneyRemains =>
            new(Cost.Currency, Cost.Amount - Prepayment.TotalPrepayment.Amount);
Если изменится Cost.Amount (для примера), то как об этом "узнает" View, чтобы обновить его представление?

И имена измените namespace Model.Money и/или class Model.Money.Money - вы же видите, что они конфликтуют.
0
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
24.05.2022, 19:50  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
То есть для View достаточно вот этих пяти типов из таблиц MainModel?
Да, но есть UserControl, которые работают с вложенными классами (как ContactsPrimitive)
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Может ли происходить изменение данных не из GUI (View)?
Нет, не может
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если изменяется какоое-то "вложенное" значение, как это изменение будет прокидываться в View?
Увы, никак. Пока не знаю, как это реализовать
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
24.05.2022, 20:44
Лучший ответ Сообщение было отмечено Harius как решение

Решение

Цитата Сообщение от Harius Посмотреть сообщение
Увы, никак. Пока не знаю, как это реализовать
Меня тоже смущает этот момент.
Слишком у вас запутанная иерархия.
Одних только разных типов с полсотни наберётся.
При этом сама задача по первому впечатлению кажется простой и не требующей столь сложно реализации.


Надо прийти к простейшему табличному представлению.
Особую проблему представляют связи "многие", "ко многим".
Так как сущности не могут иметь дополнительной логики - это излишне запутает всё.
То с точки зрения VM и View они по факту должны быть иммутабельными.
И если нужно изменить значение в экземпляре, то нужно создавать новый экземпляр.

Для отражения в свойствах VM, будет нужным сделать оболочку типа такой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public class ProxyInpc<T> : BaseInpc
    {
        public T Dto { get; private set; }
        public void SetDto(T dto)
        {
            if (!Equals(Dto, dto))
            {
                Dto = dto;
                RaisePropertyChanged(allProperties);
            }
        }
    }
 
    public class ProxyInpc : ProxyInpc<object>
    { }
Так как экземпляры разные, то нужно для этого чтобы у них был какой-то уникальный идентификатор, чтобы понять, что это одна и та же запись.
Обычно для этого используется Id (int или GUID).

Но вот со вложенными значениями которые есть во многих экземплярах придётся добавлять какую-то логику связи при смене Dto.

Вот что-то подобное должно получиться - показываю очень сокращено, только основные, значимые моменты:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    public class CompanyDto
    {
        public int Id { get; }
        public string Title { get; }
    }
    public class CompanyVm : ProxyInpc<CompanyDto> { }
 
    public class PersonDto
    {
        public  int Id { get; }
        public string Name { get; }
        public CompanyDto Company { get; }
    }
 
    public class PersonVm : ProxyInpc<PersonDto> 
    { 
        private readonly Dictionary<int, CompanyVm> companies;
 
        public CompanyVm Company => companies[Dto.Company.Id];
    }
 
 
    public class ViewModel
    {
        private readonly Dictionary<int, PersonVm> people = new Dictionary<int, PersonVm>();
        private readonly Dictionary<int, CompanyVm> companies = new Dictionary<int, CompanyVm>();
 
        private CompanyVm GetInstance (CompanyDto companyDto)
        {
            if (!companies.TryGetValue(companyDto.Id, out var company))
            {
                company = new CompanyVm();
                companies.Add(companyDto.Id, company);
            }
            return company;
        }
        private PersonVm GetInstance (PersonDto personDto)
        {
            if (!people.TryGetValue(personDto.Id, out var person))
            {
                person = new PersonVm(companies);
                people.Add(personDto.Id, person);
            }
            return person;
        }
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.05.2022, 20:44

Взаимодействие приложения с базой данных
Создана база данных и есть класс модели данных. Нужен класс, ассоциирующий модель данных с созданной БД, и класс, который будет...

Взаимодействие с базой данных Oracle
Господа здравствуйте. Получил от практикадателя задание разобраться с &quot;oracle managed data access&quot;. Задание выглядит так: У нас там...

Взаимодействие с базой данных в WordPress
Здравствуйте, как переписать скрипт взаимодействия с бд под WP, что бы не указывать $connect_db=, а сразу через $wpdb ...

Взаимодействие программы с базой данных на хостинге
Имеется сайт на бесплатном хостинге. Допустим в базе данных есть данные в формате login;password. Возможно ли как-то при нажатии на...

Взаимодействие с базой данных MySQL в проекте NetBeans
У меня был установлен MySql еще до установки NetBeans. А JDBC я установил в процессе разбирательства с темой баз данных и NetBeans....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru