Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
2 / 2 / 1
Регистрация: 27.07.2015
Сообщений: 34
1

Зависание программы после вызова хранимой процедуры на сервере

25.05.2016, 09:38. Показов 1574. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Столкнулся с проблемой следующего характера:
Вызываю хранимую процедуру на SQL сервере. Всё хорошо - работает. Но, в момент её вызова основная форма программы зависает. Т.е. пишет не отвечает, нет возможности её перемещать. Поэтому если пользователь будет её использовать, то может подумать что все зависло и закрыть её. Чтобы это не произошло решил сделать ProgressBar работающий по таймеру.

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Timer1_Timer()
If ProgressBar1.Value < ProgressBar1.Max Then
ProgressBar1.Value = ProgressBar1.Value + 1
DoEvents
Else
ProgressBar1.Value = 0
DoEvents
End If
End Sub
Запускаю таймер по клику на Command. Все крутится до момента вызова хранимой процедуры. Код ниже

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Command1_Click()
Timer1.Enabled = True
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
cmd.CommandTimeout = 20000000
cmd.ActiveConnection = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Server=Сервер;Database=MyBase;Trusted_Connection=Yes"
 cmd.CommandType = adCmdStoredProc
cmd.CommandText = "Хранимка"
 
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic
rs.LockType = adLockReadOnly
rs.Open cmd
Timer1.Enabled = False
End Sub
Про DoEvents я почитал и как понял, он больше подходит для циклов. Как мне поступить и сделать так, чтобы ProgressBar бегал, пока хранимка делается (минуты 2)? Заранее благодарю
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2016, 09:38
Ответы с готовыми решениями:

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

Синтаксис вызова хранимой процедуры?
Подскажите, как вызвать хранимую процедуру MS SQL из ASP-а?

Как оформить код для вызова хранимой процедуры, содержащей инструкцию UPDATE
добрый день хп работает, код без ошибок, но не вносятся изменения в базу и все тут..не подскажете...

Одновременный запуск хранимой процедуры на сервере
Добрый день,подскажите пожалуйста как сделать так,чтобы процедура не запускалась на сервере...

3
2 / 2 / 1
Регистрация: 27.07.2015
Сообщений: 34
26.05.2016, 14:44  [ТС] 2
Решил сделать потоками. Поток на ProgressBar работает, как надо.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private ThreadControl1 As clsThreading
Private ThreadControl2 As clsThreading
Private Sub Command1_Click()
Dim mThreadPriority As ThreadPriority
Dim mEnabled As Boolean
 Set ThreadControl1 = New clsThreading
' Set ThreadControl2 = New clsThreading
    ex = 1
    mThreadPriority = tpNormal
    mEnabled = True
   'Поток 1
    ThreadControl1.CreateNewThread AddressOf Forma2, mThreadPriority, mEnabled
   'Поток 2
    ThreadControl1.CreateNewThread AddressOf Forma1, mThreadPriority, mEnabled
end sub
в отдельном модуле функция
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Public Function Forma2()
Form1.ProgressBar1.Visible = True
 
Do
        If Form1.ProgressBar1.Value >= Form1.ProgressBar1.Max Then
        Form1.ProgressBar1.Value = 0
        Else
        Form1.ProgressBar1.Value = Form1.ProgressBar1.Value + 1
        End If
Loop
Form1.ProgressBar1.Visible = False
End Function
Вторым потоком хочу запустить выполнение хранимой процедуры. Так же создаю для нее поток. Но выпадает ошибка
Automation error CoInitialize has not be called на строчку
Visual Basic
1
Set cmd = New ADODB.Command
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Function Forma1()
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
cmd.CommandTimeout = 20000000
cmd.ActiveConnection = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Server=Сервер;Database=MyBase;Trusted_Connection=Yes"
 cmd.CommandType = adCmdStoredProc
cmd.CommandText = "Хранимка"
 
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic
rs.LockType = adLockReadOnly
rs.Open cmd
end Function
просто в форме и без потоков код работает нормально.
Помогите пожалуйста разобраться!
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36610 / 20336 / 4223
Регистрация: 12.02.2012
Сообщений: 33,660
Записей в блоге: 13
26.05.2016, 14:56 3
Вам бы лучше обратиться в раздел по SQL-серверу
0
2 / 2 / 1
Регистрация: 27.07.2015
Сообщений: 34
27.05.2016, 11:53  [ТС] 4
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Проект создаю в Microsoft Visual Basic 6.0, сюда и решил написать..

Добавлено через 20 часов 22 минуты
Проблему с ошибкой решил добавлением библиотек
Visual Basic
1
2
Public Declare Function CoInitialize Lib "ole32" (pvReserved As Any) As Long
Public Declare Function CoUninitialize Lib "ole32" () As Long
И вызовом функций внутри потока, который вызывает хранимую процедуру на сервере.
Visual Basic
1
2
3
CoInitialize ByVal 0&
....
CoUninitialize
Хранимка выполняется - все хорошо.
1
27.05.2016, 11:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2016, 11:53
Помогаю со студенческими работами здесь

Зависание после вызова функций из dll
Доброго времени суток, форумчане. Поделитесь соображениями, почему при вызове некоторых функций из...

;1 после названия хранимой процедуры
Подскажите, зачем в ADODataSet при выборе хранимой процедуры после её имени delphi подставляет...

Получить данные после выполнения хранимой процедуры в Perl.
Есть хранимая процедура (Сервер DB2) которая возвращает набор данных и есть такая необходимость...

Вызов процедуры после вызова макроса
Подскажите, как исправить следующую ошибку. Вызываю процедуру Execute для обработки данных. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru