C# Подскажите с организацией логики обновления БД

Всем привет =) Я парсю с сайта обновляемые данные Данные

и храню их в DataTable данные обновляются каждую секунду и в случайных местах, по ходу парсинга строки с сайта могут удаляться или появляться новые, то есть привязку не сделать к id или индексу. С бд не так много опыта, с ними практически не работал, то что пробовал не вышло. Так как данные не стабильны, каждый раз новые можно было с бд выводить их в datagridview и очищать бд и заполнять бд заного, при обновление таким подходом разница в datagridview не заметно, кажется что это живая таблица, то есть обновление как с сайта. Я пробовал так делать без циклов и т.п меня это вполне устроило. Но в основном коде не вышло так сделать.. Бд заполняется по принципу

for(int i =0; i <++)
 {
     for(int s =0; s <++) 
     {
     DataTableOne.Rows.Add("Здесь заношу данные");
     }
 }
dataGridView1.DataSource = DataTableOne; dataGridView1.Update(); 
DataTableOne.Clear(); //Было бы идеально, если так бд очищалась бы и заполнялась заново.

При активном изменение данных в datagrid кажется что это живая таблица, но вместо этого DataTableOne.Clear(); очищает бд и данные с datagrid тоже удаляются. Ещё пробовал делать с подменной таблицей так

 flagRateTable = true;
    for(int i =0; i <++)
     {
         for(int s =0; s <++) 
         {
         DataTableOne.Rows.Add("Здесь заношу данные");
         DataTableTwo.Rows.Add("Здесь заношу данные");
         }
     }
if (flagRateTable)
                    {
                        DataTableTwo.Clear();
                        dataGridView1.DataSource = DataTableOne; dataGridView1.Update();                    
                        flagRateTable = false;
                    }
                    else
                    {
                        DataTableOne.Clear();
                        dataGridView1.DataSource = DataTableTwo; dataGridView1.Update();                    
                        flagRateTable = true;
                    }

По логике если flagRateTable true очищаю вторую бд и вывожу в dataGridView1 DataTableOne если flagRateTable false очищаю первую бд и вывожу в dataGridView1 DataTableTwo. По идее должно всё работать, но вместо этого у меня отображаются обе бд, то есть как в первом примере с очисткой с dataGridView1 удаляются все отображаемые данные, то в втором примере у меня отображаются обе таблицы, поочередно очищаются и отображаются вместе. Подскажите с логикой и как лучше обновлять подобные бд.


Ответы (1 шт):

Автор решения: Alexander Petrov

Если я правильно понял суть вопроса:

public partial class Form1 : Form
{
    DoubleBufferedDataGridView dataGridView;
    Button updateButton;

    DataTable dataTable1;
    DataTable dataTable2;

    Random random = new Random();

    public Form1()
    {
        //InitializeComponent();
        dataGridView = new DoubleBufferedDataGridView { Parent = this, Dock = DockStyle.Top, Height = 200 };
        updateButton = new Button { Parent = this, Text = "Update", Top = dataGridView.Bottom + 20 };

        updateButton.Enabled = false;
        updateButton.Click += UpdateButton_Click;
        this.Load += Form1_Load;
    }

    private async void Form1_Load(object sender, EventArgs e)
    {
        dataTable1 = new DataTable();

        dataTable1.Columns.Add("id", typeof(int));
        dataTable1.Columns.Add("value", typeof(double));

        dataTable2 = dataTable1.Clone();

        await FillDataTable(dataTable1);
        dataGridView.DataSource = dataTable1;

        await FillDataTable(dataTable2);
        updateButton.Enabled = true;
    }

    private Task FillDataTable(DataTable dataTable)
    {
        return Task.Run(() =>
        {
            dataTable.Clear();

            for (int i = 0; i < 10; i++)
                dataTable.Rows.Add(random.Next(), random.NextDouble());
        });
    }

    private async void UpdateButton_Click(object sender, EventArgs e)
    {
        updateButton.Enabled = false;

        if (dataGridView.DataSource == dataTable1)
        {
            dataGridView.DataSource = dataTable2;
            await FillDataTable(dataTable1);
        }
        else
        {
            dataGridView.DataSource = dataTable1;
            await FillDataTable(dataTable2);
        }

        updateButton.Enabled = true;
    }
}

Два дататейбла. На старте приложения заполняется первый и привязывается к гриду. Тем временем заполняется второй.

При нажатии на кнопку они меняются местами. И снова происходит заполнение данными другого дататейбла.

Я меняю доступность кнопки (свойство Enabled), чтобы нельзя было её нажать, пока новые данные не загружены полностью.

В методе FillDataTable реализуйте свой код получения новых данных и занесения в DataTable.


Грид с двойной буферизацией:

public class DoubleBufferedDataGridView : DataGridView
{
    protected override bool DoubleBuffered => true;
}

Используемые пространства имён:

using System;
using System.Data;
using System.Threading.Tasks;
using System.Windows.Forms;
→ Ссылка