Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Подключение к базе данных при нестабильном интернете. / 24 сообщений из 24, страница 1 из 1
30.12.2020, 10:51
    #40032526
jeanssp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Здравствуйте! У меня приложение на Windows Forms.Я подключаюсь к базе данных с использованием Entity Framework. Периодически то выключается то включается интернет . При выключении приложение зависает. Нужно что бы все данные из базы данных скачивались сразу при первом подключении и формы работали нормально при разрыве соединения, а при восстановлении соединения происходила синхронизация. Пользователя пока всего три. Как достичь такого результата? Благодарю.
...
Рейтинг: 0 / 0
30.12.2020, 11:30
    #40032547
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
То есть каждый пользователь работает с локальной копией БД? Один удалил внешний ключ, другой добавил запись с этим внешним ключом, а потом всё должно волшебным образом синхронизироваться?
...
Рейтинг: 0 / 0
30.12.2020, 12:29
    #40032571
jeanssp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Shocker.Pro
То есть каждый пользователь работает с локальной копией БД? Один удалил внешний ключ, другой добавил запись с этим внешним ключом, а потом всё должно волшебным образом синхронизироваться?

Я думал может есть вариант с приоритетом пользователей по времени изменения. Если нет, то нужно что бы форма работала только для чтения. Возможно так?
...
Рейтинг: 0 / 0
30.12.2020, 12:57
    #40032585
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Ну так тебе EF не поможет, тебе нужно саму архитектуру базы прежде всего адаптировать. К примеру, все ID не должны быть автоинкрементными, а, например, GUID-ами
jeanssp
Я думал может есть вариант с приоритетом пользователей по времени изменения.
это никак не отвечает на мой вопрос про внешний ключ.
jeanssp
Если нет, то нужно что бы форма работала только для чтения.
Причем тут форма? EF - это про БД, а не про формы. Форму как напишешь, так и будет.

В общем, если ты считаешь, что есть волшебная пилюля для существующей БД - нет, ее нет. Работа с отвязанной БД должна быть продумана на уровне ТЗ и архитектуры, потом спроектирована, а потом реализована.
...
Рейтинг: 0 / 0
30.12.2020, 13:11
    #40032592
jeanssp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Shocker.Pro, Может как нибудь выкачивать бд, сохранять ее в XML на локальном компьютере , и менять подключение то к одной то к другой бд?
...
Рейтинг: 0 / 0
30.12.2020, 13:41
    #40032603
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
вопрос не в том, как работать с локальной копией, а в том, что ты будешь делать при слиянии изменений нескольких пользователей
...
Рейтинг: 0 / 0
30.12.2020, 14:16
    #40032619
jeanssp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Shocker.Pro,
Пользователи не будут ничего менять. Но должны иметь возможность просматривать данные. Ничего страшного если данные не совсем свежие.
...
Рейтинг: 0 / 0
30.12.2020, 14:27
    #40032624
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
jeanssp
Пользователи не будут ничего менять
тогда зачем им БД локально? Скачивай и кешируй для них готовые отчеты.
...
Рейтинг: 0 / 0
30.12.2020, 14:51
    #40032633
jeanssp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Shocker.Pro,
Это система учета для розничного магазина. Я еще к ней интернет магазин пристраиваю на blazor.(почти готов, спасибо Вам) Там сидят продавцы в отделе(2 отдела) и им надо посмотреть товар на остатках по артикулу, найти клиента по номеру телефона с его заказами. Интернет конечно можно сделать стабильный , но это получится 10000 в год. А так он у меня бесплатный. Если не решу вопрос с локальной бд, придется интернет налаживать.
...
Рейтинг: 0 / 0
30.12.2020, 15:06
    #40032635
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
ну если это готовое, а не пишущееся изделие, но надо смотреть конкретику, информации слишком мало
...
Рейтинг: 0 / 0
30.12.2020, 15:38
    #40032642
jeanssp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Shocker.Pro,
Я его только написал. Сейчас внедряю. БД заполнил уже реальными данными. Вот код формы.
Код: 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.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace point4
{
    public partial class Frm_stock : Form
    {
        public Frm_stock()
        {
            InitializeComponent();
        }
        private void Frm_stock_Load(object sender, EventArgs e)
        {
            using (point4Entities3 db = new point4Entities3())
            {
                cbo_articul.DataSource = db.articuls.ToList();
                cbo_articul.DisplayMember = "articul";
                cbo_articul.ValueMember = "articul_id";
            }
            
        }
        private void Populate_dgv_stock()
        {
            using(point4Entities3 db = new point4Entities3())
            {
                var f_data = db.view_goods_stocks.ToList()
                     .Where(x => x.articul.Equals(cbo_articul.Text));
                dgv_stock.DataSource = f_data.ToList();
            }
        }
        private void Populate_dgv_stock_ImageCount()
        {
            using (point4Entities3 db = new point4Entities3())
            {
                var f_data = db.sp_Dgv().ToList()
                    .Where(x => x.articul.Equals(cbo_articul.Text));
                dgv_stock.DataSource = f_data.ToList();
            }
        }
        private void btn_search_equals_Click(object sender, EventArgs e)
        {
            Populate_dgv_stock();
        }
        private void btnImageCount_Click(object sender, EventArgs e)
        {
            Populate_dgv_stock_ImageCount();
        }

        private void btnImage_Click(object sender, EventArgs e)
        {

        }

        private void btnDownloadImages_Click(object sender, EventArgs e)
        {
            int nomId = (int)dgv_stock.CurrentRow.Cells["nomencl_id"].Value;
            string articul = dgv_stock.CurrentRow.Cells["articul"].Value.ToString();
            string widht = dgv_stock.CurrentRow.Cells["widht"].Value.ToString();
            string lenght_id = dgv_stock.CurrentRow.Cells["lenght_id"].Value.ToString();

            FrmEditImages frmImages = new FrmEditImages();
            frmImages.Filename = articul + widht + lenght_id;
            frmImages.NomID = nomId;
            
            frmImages.ShowDialog();
        }

        private void cbo_articul_SelectedIndexChanged(object sender, EventArgs e)
        {
            Populate_dgv_stock_ImageCount();
        }

        private void btnDownloadImagesArt_Click(object sender, EventArgs e)
        {
            FrmArticulImages frmArticulImages = new FrmArticulImages();
            frmArticulImages.Filename = cbo_articul.Text;
            frmArticulImages.ArtID = (int)cbo_articul.SelectedValue;
            frmArticulImages.ShowDialog();
        }
    }
}
...
Рейтинг: 0 / 0
30.12.2020, 16:26
    #40032663
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Изучай тему Репликация БД . Если у тебя клиенты только читают БД, то обновление копии вполне просто можно организовать встроенными средствами MS SQL. В твоей проге ничего менять не надо.
...
Рейтинг: 0 / 0
30.12.2020, 19:09
    #40032695
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
jeanssp
Shocker.Pro,
Я его только написал. Сейчас внедряю. БД заполнил уже реальными данными. Вот код формы.
Код: 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.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace point4
{
    public partial class Frm_stock : Form
    {
        public Frm_stock()
        {
            InitializeComponent();
        }
        private void Frm_stock_Load(object sender, EventArgs e)
        {
            using (point4Entities3 db = new point4Entities3())
            {
                cbo_articul.DataSource = db.articuls.ToList();
                cbo_articul.DisplayMember = "articul";
                cbo_articul.ValueMember = "articul_id";
            }
            
        }
        private void Populate_dgv_stock()
        {
            using(point4Entities3 db = new point4Entities3())
            {
                var f_data = db.view_goods_stocks.ToList()
                     .Where(x => x.articul.Equals(cbo_articul.Text));
                dgv_stock.DataSource = f_data.ToList();
            }
        }
        private void Populate_dgv_stock_ImageCount()
        {
            using (point4Entities3 db = new point4Entities3())
            {
                var f_data = db.sp_Dgv().ToList()
                    .Where(x => x.articul.Equals(cbo_articul.Text));
                dgv_stock.DataSource = f_data.ToList();
            }
        }
        private void btn_search_equals_Click(object sender, EventArgs e)
        {
            Populate_dgv_stock();
        }
        private void btnImageCount_Click(object sender, EventArgs e)
        {
            Populate_dgv_stock_ImageCount();
        }

        private void btnImage_Click(object sender, EventArgs e)
        {

        }

        private void btnDownloadImages_Click(object sender, EventArgs e)
        {
            int nomId = (int)dgv_stock.CurrentRow.Cells["nomencl_id"].Value;
            string articul = dgv_stock.CurrentRow.Cells["articul"].Value.ToString();
            string widht = dgv_stock.CurrentRow.Cells["widht"].Value.ToString();
            string lenght_id = dgv_stock.CurrentRow.Cells["lenght_id"].Value.ToString();

            FrmEditImages frmImages = new FrmEditImages();
            frmImages.Filename = articul + widht + lenght_id;
            frmImages.NomID = nomId;
            
            frmImages.ShowDialog();
        }

        private void cbo_articul_SelectedIndexChanged(object sender, EventArgs e)
        {
            Populate_dgv_stock_ImageCount();
        }

        private void btnDownloadImagesArt_Click(object sender, EventArgs e)
        {
            FrmArticulImages frmArticulImages = new FrmArticulImages();
            frmArticulImages.Filename = cbo_articul.Text;
            frmArticulImages.ArtID = (int)cbo_articul.SelectedValue;
            frmArticulImages.ShowDialog();
        }
    }
}





Вот как написал, так и работает.
Почитайте что-ли про SOLID, гексагональную архитектуру, Microsoft Application Architecture...

Ну или если хотите готовенькое, то выкидывайте Entity Framework и берите старый добрый DataSet, он как раз для работы в отсоединённом режиме придуман был.
В этом, кстати, в каждой книжке по ADO.NET, что я в руках держал, написано.
...
Рейтинг: 0 / 0
30.12.2020, 19:12
    #40032698
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
jeanssp
Я подключаюсь к базе данных с использованием Entity Framework. Периодически то выключается то включается интернет .

База данных торчит в интернет - это пять! Безопасность на уровне.
...
Рейтинг: 0 / 0
31.12.2020, 00:21
    #40032778
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
skyANA
База данных торчит в интернет - это пять! Безопасность на уровне.
Давай надеяться, что либо VPN либо RDP ))
...
Рейтинг: 0 / 0
31.12.2020, 10:44
    #40032814
jeanssp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
skyANA, Что я делаю неправильно, поясните, пожалуйста
...
Рейтинг: 0 / 0
31.12.2020, 11:32
    #40032819
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
>jeanssp, вчера, 10:51 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1332189&msg=22256940][22256940]
>... Нужно что бы все данные из базы данных скачивались сразу...
<
Периодически, каждый раз с построением нового соединения, качивай данные в кеш.
...
Рейтинг: 0 / 0
31.12.2020, 12:30
    #40032829
RMT
RMT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Я бы сказал, что тут две проблемы:
1) Классическая проблема конкурентного доступа. Решения два: пессимистичный (блокировка записи до сохранения сущности), оптимистичный (фетч более свежей копии данных, основываясь на дифф row_version);
2) Отсутствие алгоритма поллинга данных.
...
Рейтинг: 0 / 0
01.01.2021, 13:15
    #40032945
jeanssp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Я еще думаю попробовать выполнять операцию извлечения данных из БД в асинхронном режиме.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public  async Task Populate_dgv_stock()
        {
            using(point4Entities3 db = new point4Entities3())
            {
                var f_data = await db.view_goods_stocks.ToListAsync()
                     .Where(x => x.articul.Equals(cbo_articul.Text));
                dgv_stock.DataSource = f_data.ToListAsync();
               
            }
        }


Этот код выдает ошибку. Как исправить?
И еще обернуть это в try catch может быть ?
...
Рейтинг: 0 / 0
01.01.2021, 15:50
    #40032960
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
jeanssp
ошибку
А откуда у f_data возьмется метод ToListAsync?
Нафига ты вообще материализуешь всю коллекцию до выполнения фильтрации?
...
Рейтинг: 0 / 0
01.01.2021, 16:29
    #40032962
jeanssp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Shocker.Pro,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 public async Task Populate_dgv_stock()
        {
            using (point4Entities3 db = new point4Entities3())
            {
                var f_data = await db.view_goods_stocks
                     .Where(x => x.articul.Equals(cbo_articul.Text));
                dgv_stock.DataSource = f_data.ToList();

            }
        }



Все равно не пашет. Ну не понимаю я!
...
Рейтинг: 0 / 0
01.01.2021, 16:45
    #40032966
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Слушай, ну надо же в конце концов прочитать текст ошибки, тебе же компилятор четко говорит, в чем проблема. Или ты так и будешь куски кода сюда выкладывать? Что ты тут пытаешься ожидать с помощью await?
...
Рейтинг: 0 / 0
01.01.2021, 16:48
    #40032968
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Когда ты наводишь мышиный курсор на метод, студия показывает тебе, какой тип возвращается. Не используй var, если не можешь сходу сообразить, какого типа у тебя переменная, хотя студия это тоже подсказывает.

Ну про то, что учебник надо прочесть до того, как писать код, это я уже, кажется, тебе говорил.
...
Рейтинг: 0 / 0
01.01.2021, 17:24
    #40032972
jeanssp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к базе данных при нестабильном интернете.
Shocker.Pro,
При помощи await я хочу добиться что бы форма не зависала при кратковременном отключении интернета.
Код: c#
1.
 var f_data = await db.view_goods_stocks.Where(x => x.articul.Equals(cbo_articul.Text)).ToListAsync();


вот так ошибок нет, но когда кабель выдергиваю, при событии
Код: c#
1.
cbo_articul_SelectedIndexChanged(object sender, EventArgs e)


все зависает и вываливается ошибка (SqlException: Ошибка на транспортном уровне при получении результатов с сервера. (provider: Session Provider, error: 19 - Физическое подключение не используется)
)
Как бы ее обработать, что бы форма не зависала
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Подключение к базе данных при нестабильном интернете. / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]