Каков наилучший способ иметь класс DataService, который обрабатывает все соединения и обновления базы данных - PullRequest
0 голосов
/ 04 мая 2019

Я думаю, что это должно быть простым делом, но я думаю об этом. Это приложение Windows Forms на C #.

Я создал класс 'DataService', который реализует и заполняет несколько наборов данных, которые я определил с помощью конструктора наборов данных VS.

Затем я передаю эти наборы данных бизнес-объектам, которые могут отображать, обновлять, добавлять и удалять строки в этих наборах данных, а затем «DataService» обрабатывать .AcceptChanges (). Ни один из моих столов не большой.

Он работает отлично, за исключением того, что обновления никогда не передаются обратно в базу данных (MS-Access).

Я пытался использовать get / set для передачи наборов данных в бизнес-классы. Наборы данных корректно обновляются, и я вижу их обратно в классе 'DataService' в режиме отладки.

Я много исследовал, но большинство реализаций с отдельной службой данных гораздо более абстрактны, чем эта. Моя идея состояла в том, чтобы иметь только одну копию когда-либо созданного набора данных, чтобы класс DataService мог видеть обновления и фиксировать их с помощью dataset.AcceptChanges ().

Конечно, я, вероятно, не реализовал это правильно (даже если это работоспособный вариант), потому что обновления не фиксируются - база данных Access никогда не обновляется.

В приведенном ниже примере у меня есть один набор данных dsWLQueues с двумя таблицами данных. dsWLQueues был создан в конструкторе наборов данных, который генерирует все операторы обновления и т. д. ...

Может ли кто-нибудь помочь с моим пониманием?

Спасибо

public class DataService
    {
        // Class to handle all data retrievals and management
        private static dsWLQueues dslWLQueues = new dsWLQueues();

        public static dsWLQueues Queues {get { return dslWLQueues; } set { dslWLQueues = value; dslWLQueues.AcceptChanges(); } }

        public static void LoadAllData()
        {
            dsWLQueuesTableAdapters.SongQueueNamesTableAdapter daSongQueueNames = new dsWLQueuesTableAdapters.SongQueueNamesTableAdapter();
            dslWLQueues.Clear();
            daSongQueueNames.Fill(dslWLQueues.SongQueueNames);

            dsWLQueuesTableAdapters.SongQueuesTableAdapter daSongQueues = new dsWLQueuesTableAdapters.SongQueuesTableAdapter();
            daSongQueues.Fill(dslWLQueues.SongQueues);
        }

Затем использовать этот класс:

public class QueueList : System.Windows.Forms.UserControl
    {
        private dsWLQueues dsSongQueues;
        dsSongQueues = DataService.Queues;
            ...some code that displays and updates/deletes/adds data...
        DataService.Queues = dsSongQueues;
    }

1 Ответ

0 голосов
/ 21 мая 2019

Я использовал DataAdapter.AcceptChanges (), который обновляет только набор данных в памяти. Мне нужно было использовать DataAdapter.Update.

Теперь решение работает отлично. У меня есть DataService, который загружает все DataTables и делает их доступными через методы для всех других классов.

Doh!

        public static DataTable Codes { get { return dtWLCodes; } }
        public static DataTable Songs { get { return dtWLSongs; } }
        public static DataTable SongLyrics { get { return dtWLSongLyrics; } }
        public static void Commit (string sTable = "")
        {
            if (sTable == "" || sTable == "Songs") { daWLSongs.Update(dslWLSongs.Songs); }
            if (sTable == "" || sTable == "SongLyrics") { daWLSongLyrics.Update(dslWLSongs.SongLyrics); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...