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 шт):
Если я правильно понял суть вопроса:
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;