BackgroundWorker и заполнение данными таблицы в БД.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

BackgroundWorker и заполнение данными таблицы в БД.

Сообщение Thomas » 03.08.2007 (Пт) 19:52

Приветствую всех.
Пишу приложение, которое при работе создает в БД (адресную) таблицу и заполняет ее данными. Процесс заполнения данными(30-40 тысяч строк) таблицы очень длительный. Соответственно в это время программа не реагирует, а с использованием CPU на 99% трудиться "в поте лица". Надо дать возможность пользователю выполнять еще какие либо действия с программой. Для этого нужно использовать BackgroundWorker.
Нужно поместить в него одну процедуру. Но она не возвращает никакого значения, а построчно заполняет данными таблицу в БД из таблицы ДатаСета.
В поиске был.
В MSDN смотрел.
приведенные здесь примеры работают с функциями, которые возвращают значение. А как быть в моём случае?
Код: Выделить всё

Private Sub InsertInto()
        Dim sql As String = "INSERT INTO " & tableName & "(RowId"
        For Each adComp In comps
            sql &= ", " & adComp.NamePost
        Next
        sql &= ") VALUES (?"
        For Each adComp In comps
            sql &= ", ?"
        Next
        sql &= ");"

        For Each dr As DataRow In db.myDs.Tables(tableName).Rows
            db.AddSqlParameter("RowId", dr("RowId"))
            For Each adComp In comps
                db.AddSqlParameter(adComp.NamePost, dr(adComp.NamePost))
            Next
            db.DoNonQuery(sql)
            db.ClearSqlParametrs()
        Next
    End Sub

Процедура выполняет генерацию sql- команды в зависимости сколько и каких компонентов адреса нужно добавить в таблицу. Потом в цикле считывает значения строк в таблице ДС, добавляет параметр для sql команды и выполняет ее. db и adComp экземпляры классов, comps коллекция классов adComp.

Ни как не соображу КАК поместить эту процедуру в BackgroundWorker? :oops:
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 06.08.2007 (Пн) 11:30

Копи-паст
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 06.08.2007 (Пн) 11:56

DoEvents?
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 18.08.2007 (Сб) 0:30

Приветствую всех.
Основной вопрос на конец то решил.
Смог применить backgroundWorker к "долгоиграющему" методу.
Переделал метод на функцию, добавил backgroundWorker и вот что получилось.
Код: Выделить всё

Private Function FillTableDataBase(ByVal sql As String, ByVal dt As DataTable, ByVal bgworker As BackgroundWorker, ByVal e As DoWorkEventArgs) As Integer
        Dim progress, loper As Integer  'считаем строки и процент выполнения
        For Each dr As DataRow In dt.Rows
            db.AddSqlParameter("RowId", dr("RowId"))
            For Each adComp In comps
                db.AddSqlParameter(adComp.NamePost, dr(adComp.NamePost))
            Next
            db.DoNonQuery(sql)
            db.ClearSqlParametrs()
            loper += 1
            progress = Convert.ToInt32(loper / count * 100)
            bgworker.ReportProgress(progress)
            If bgworker.CancellationPending Then
                e.Cancel = True
                Exit For
            End If
        Next
        Return loper ' возвращаем кол-во строк
    End Function
Private Sub btnSchrijfXML_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSchrijfXML.Click
        tableName = txtTableName.Text
        If GetPermission() Then
            tslStatus.Text = "Begin creeren Xml-bestand."
            FillAddressComponents()
            CreateTable(tableName)
            FillTableDataSet(tableName)
            Dim sql As String = MakeSql()
            BackgroundWorker1.RunWorkerAsync(New Object() {sql, dtOut})
            Timer1.Start() ' запускаем таймер для проверки - выполнено обновление таблицы или нет?
        End If
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim bgw As BackgroundWorker = CType(sender, BackgroundWorker)
        Dim args() As Object = CType(e.Argument, Object())
        e.Result = FillTableDataBase(args(0), args(1), bgw, e)
    End Sub

    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ToolStripProgressBar1.Value = e.ProgressPercentage
        tslStatus.Text = e.ProgressPercentage & "% progress"
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        If e.Cancelled Then
            tslStatus.Text = "Processing aborted"
        Else
            tslStatus.Text = "Processing completed: "
            tslStatus.Text &= Convert.ToInt32(e.Result).ToString
            workComplete = True
        End If
    End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If workComplete Then
            FillPsCode(tableName) 'выполняем программу дальше
            WriteXml()
            Timer1.Stop()
        Else
            Timer1.Start() ' ждем до следующей проверки
        End If
    End Sub 'in orde


Единственное, что осталось НЕ ЯСНЫМ , это
почему возникает ошибка при попытке отобразить прогрес процесса.

http://img410.imageshack.us/img410/9105/foutzr6.jpg
Thomas, уже всё-таки перестань использовать img на своих картинках, из-за которых разлезается весь топик и которые весят от 100 кб. --GSerg

В чем грабли? Я никак не соображу. :oops:

Какие могут быть ошибки?
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 20.08.2007 (Пн) 10:30

Свойства BackgroundWorker посмотри)
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 20.08.2007 (Пн) 22:24

Sebas
Спасибо.
А ларчик просто открывался. :D
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 73

    TopList