powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / отображение прогресса при выполнении запроса
5 сообщений из 5, страница 1 из 1
отображение прогресса при выполнении запроса
    #39939660
erleug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
собственно есть метод, в котором выполняется запрос для "перегонки" файлов с одной базы в другую. Файлов много, программа подвисает и хочется чтобы отображался прогресс выполнения.

Такой метод

Код: 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.
private void TransferFiles()
        {
            using (SqlConnection conn = new SqlConnection(ConnectionString.Value))
            {
                try
                {
                    conn.Open();
                    string fullPath = System.Reflection.Assembly.GetAssembly(typeof(Form1)).Location;                    // Получаем полное местоположение exe файла сборки 
                    string theDirectory = Path.GetDirectoryName(fullPath);                                               // Получаем папку в котором он находится
                    DataTable dt = new DataTable();
                    string queryOpen = String.Format("select top {7} t1.id, t1.{0}, t2.{1} " +
                                                     "from {2}.dbo.{3} t1 " +
                                                     "left join {4}.dbo.{5} t2 on t1.id = t2.{6}",
                                                     ConnectionString.DoVarchar, colNameImageCmb.Text, ConnectionString.InitialCatalog, ConnectionString.TableNameText,
                                                     initialCatalogTxb.Text, tableNameCmb.Text, fieldCommunicationCmb.Text, numericNumberOfLines.Value);
                    if (!String.IsNullOrEmpty(tableNameCmb.Text) && !String.IsNullOrEmpty(colNameImageCmb.Text) && !String.IsNullOrEmpty(fieldCommunicationCmb.Text))
                    {
                        SqlCommand command = new SqlCommand(queryOpen, conn);
                        SqlDataReader reader = command.ExecuteReader();
                        dt.Load(reader);
                        reader.Close();
                        foreach (var item in dt.Select())
                        {
                            int fileId = (int)item["id"];
                            string fileName = (string)item[ConnectionString.DoVarchar];
                            byte[] fileContent = (byte[])item[colNameImageCmb.Text];

                            using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate))
                            {
                                fs.Write(fileContent, 0, fileContent.Length);
                            }
                            string queryLoad = String.Format("UPDATE {0} SET \"{1}\" = (SELECT * FROM OPENROWSET(BULK '{4}\\{2}', SINGLE_BLOB) AS x), " +
                                                             "{5} = (GetDate()) where \"id\" = {3}",
                                                                ConnectionString.TableNameText, ConnectionString.Filestream, fileName, fileId, theDirectory, ConnectionString.Datetime);
                            command = new SqlCommand(queryLoad, conn);
                            command.ExecuteNonQuery();
                        }
                    }
                    else
                        MessageBox.Show("Выберите все поля!");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }



Я немного далек от того как можно это реализовать. Буду благодарен какой-то подсказке, как можно это реализовать
...
Рейтинг: 0 / 0
отображение прогресса при выполнении запроса
    #39940191
erleug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавил прогресс и backgroundworker

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i <= 100; i++)
            {
                Thread.Sleep(10);
                backgroundWorker1.WorkerReportsProgress = true;
                backgroundWorker1.ReportProgress(i);
            }
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            circularProgressBar1.Value = e.ProgressPercentage;
            progressLbl.Text = e.ProgressPercentage.ToString() + "%";
            if (progressLbl.Text == "100%")
            {
                MessageBox.Show("Копирование успешно завершено!");
            }
        }



и в метод где выполняется запрос в цикле, в конце цикла добавил:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  foreach (var item in dt.Select())
                        {
                            int fileId = (int)item["id"];
                            string fileName = (string)item[ConnectionString.DoVarchar];
                            byte[] fileContent = (byte[])item[colNameImageCmb.Text];

                            using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate))
                            {
                                fs.Write(fileContent, 0, fileContent.Length);
                            }
                            string queryLoad = String.Format("UPDATE {0} SET \"{1}\" = (SELECT * FROM OPENROWSET(BULK '{4}\\{2}', SINGLE_BLOB) AS x), " +
                                                             "{5} = (GetDate()) where \"id\" = {3}",
                                                                ConnectionString.TableNameText, ConnectionString.Filestream, fileName, fileId, theDirectory, ConnectionString.Datetime);
                            command = new SqlCommand(queryLoad, conn);
                            command.ExecuteNonQuery();

                            backgroundWorker1.RunWorkerAsync();
                            circularProgressBar1.Show();
                        }



вылетает ошибка (скрин) и обрывается выполнение запроса, но прогресс выполняется до 100%. Подскажите где ошибаюсь
...
Рейтинг: 0 / 0
отображение прогресса при выполнении запроса
    #39940262
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erleug,

вы в цикле запускаете BackgroundWorker несколько раз (backgroundWorker1.RunWorkerAsync();), а он не хочет несколько раз работать, он хочет работать 1 раз.
если надо запустить в цикле несколько воркеров инстанцируйте их независимо друг от друга.
Используйте асинхронность, ADO.NET это позволяет и не надо будет городить вот это...
...
Рейтинг: 0 / 0
отображение прогресса при выполнении запроса
    #39940280
erleug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

это добавить async await я так понимаю?
...
Рейтинг: 0 / 0
отображение прогресса при выполнении запроса
    #39940396
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erleug,
есть практически готовое решение прямо для твоей проблемы- сам делал аналогичный функционал
Код: 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.
  private int currentProgress = 0;
        public int CurrentProgress
        {
            get { return this.currentProgress; }
            private set
            {
                if (this.currentProgress != value)
                {
                    this.currentProgress = value;
                }
            }
        }
        public int rowcount { get; set; } = 0; //общее количество элементов, которое нужно обработать
        private int _curworkedspravrowindex = 0; //индекс текущего обрабатываемого элемента
        public int curworkedspravrowindex
        {
            get
            { return _curworkedspravrowindex; }
            set
            {
                _curworkedspravrowindex = value;
                worker.ReportProgress(_curworkedspravrowindex * 100 / rowcount);
                progressText = _curworkedspravrowindex.ToString() + " из " + rowcount.ToString();
            }
        }



                worker = new BackgroundWorker(); //инициализируешь где-нибудь в конструкторе и хранишь ссылку на воркера
                worker.WorkerReportsProgress = true;
                worker.DoWork += DoWork;
                worker.ProgressChanged += new ProgressChangedEventHandler(ProgressChanged);
                worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
                worker.RunWorkerAsync();

  private void DoWork(object sender, DoWorkEventArgs e)
        {
         progressText = "...";
///
          curworkedspravrowindex++;
///
}

  private void ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.CurrentProgress = e.ProgressPercentage;
        }
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / отображение прогресса при выполнении запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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