Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
1 / 1 / 1
Регистрация: 19.04.2018
Сообщений: 101

Дождаться окончания выполнения хранимой процедуры

09.07.2024, 15:34. Показов 902. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе.
Вызываю хранимую процедуру
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
private void FolgingSession()
{
    if (File.Exists(@tbPath.Text) && counter)
    {
        FbConnection fb = MyConnect.GetConnection("sys", "electron", @"localhost:" + tbPath.Text);
        try
        {
            fb.Open();
            using (var transaction = fb.BeginTransaction())
            {
                try
                {
                    FbCommand cmd = new FbCommand("\"SessionFolging\"", fb, transaction);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("@FinalFolgingSession", FbDbType.Integer).Value = int.Parse(tbSessionID.Text);
                    cmd.Parameters.Add("@FinalFolgingSessionDateTime", FbDbType.TimeStamp).Value = DateTime.Parse(tbEndDateTime.Text);
                    cmd.ExecuteNonQuery();
                    transaction.Commit();
                    cmd.Dispose();
                    fb.Close();
 
                    ReadSessionTable();
                    GetSessionData();
                }
                catch (FbException ex)
                {
                    MessageBox.Show(ex.GetType().FullName, "Ошибка 1");
                    int err = ex.HResult;
                    if (ex.HResult == -2147467259)
                    {
                        MessageBox.Show("Пользователей не имеет доступа к таблице", "Ошибка 2");
                    }
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
}
Как дождаться окончания выполнения ХП? у ХП нет возвращаемых параметров
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.07.2024, 15:34
Ответы с готовыми решениями:

Привязка выполнения хранимой процедуры к кнопке и вывод результата в listbox
Добрый вечер, есть хранимая процедура, хочется привязать ее выполнение к кнопке и сделать вывод результата в listbox1 Разбираюсь в...

Как дождаться окончания асинхроного метода?
У класса WebClient, есть такой метод как "DownloadFileAsyns", так вот как мне дождаться его окончания, чтоб продолжить движение в коде,...

Дождаться окончания UI события из другого потока
Есть такой код: namespace Lab_6 { public partial class Form1 : Form { public int High = 1; public...

15
 Аватар для Andrey-MSK
3346 / 2233 / 387
Регистрация: 14.08.2018
Сообщений: 7,537
Записей в блоге: 4
09.07.2024, 15:54
Цитата Сообщение от _tester_ Посмотреть сообщение
Как дождаться окончания выполнения ХП?
Её выполнение заканчивается между вот этим
Цитата Сообщение от _tester_ Посмотреть сообщение
C#
1
cmd.ExecuteNonQuery();
и этим
Цитата Сообщение от _tester_ Посмотреть сообщение
C#
1
transaction.Commit();
А где в catch transaction.Rollback()?
0
1 / 1 / 1
Регистрация: 19.04.2018
Сообщений: 101
09.07.2024, 16:01  [ТС]
Почему спрашиваю, дело вот в чем, ХП выполняется где то секунд 30. Но, судя по логу, процедуры ReadSessionTable();
и GetSessionData(); выполняются сразу!

C++
1
2
3
15:35:00 9 июля 2024 г. begin Folging Session
15:35:03 9 июля 2024 г. Open BD for Sessions table
15:35:04 9 июля 2024 г. Open DB for Sessions info
т.е. код н е ждет собственно окончания выполнения ХП, а запустив его продолжает выполнять следующие инструкции
0
 Аватар для Andrey-MSK
3346 / 2233 / 387
Регистрация: 14.08.2018
Сообщений: 7,537
Записей в блоге: 4
09.07.2024, 16:13
Цитата Сообщение от _tester_ Посмотреть сообщение
т.е. код н е ждет собственно окончания выполнения ХП
Не может быть
Выполняет для подключения инструкцию Transact-SQL и возвращает количество задействованных в инструкции строк.
SqlCommand.ExecuteNonQuery Метод
0
1 / 1 / 1
Регистрация: 19.04.2018
Сообщений: 101
09.07.2024, 16:36  [ТС]
выяснилось следующее: При прямом запуске процедуры при нажатии на кнопку все работает как надо:
C#
1
2
3
4
5
6
7
8
9
private void button1_Click(object sender, EventArgs e)
{
    GoFolging();
}
 
private void GoFolging()
{
       FolgingSession();
}
и лог правильный
Code
1
2
6:21:39 9 июля 2024 г. begin Folging Session       <-----
16:21:50 9 июля 2024 г. Open DB for Sessions table
т.е. ХП занимает 11 секунд

для запуска FolgingSession(); по расписанию у меня подключен Quartz.NET и создан класс
C#
1
2
3
4
5
6
7
8
9
[DisallowConcurrentExecution]
private class Job : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
            var mc = new Form1();
            mc.GoFolging();
    }
}
При запуске же по расписанию лог такой:
Code
1
2
16:24:00 9 июля 2024 г. begin Folging Session
16:24:03 9 июля 2024 г. Open DB for Sessions table
т.е. ХП не заняло ничего
0
 Аватар для Andrey-MSK
3346 / 2233 / 387
Регистрация: 14.08.2018
Сообщений: 7,537
Записей в блоге: 4
09.07.2024, 16:43
_tester_, Надеюсь вот это
Цитата Сообщение от _tester_ Посмотреть сообщение
C#
1
public async Task Execute(IJobExecutionContext context)
запускается через await? Если запущено без него, то задача улетит вникуда... Это раз, второе - где в этом методе вызов асинхронного метода? В чём смысл async?

Добавлено через 1 минуту
_tester_, Если уж очень нужно посмотреть как ХП отработает, до добавьте туда выходной параметр и проверяйте его после окончания её выполнения
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
await sqlCommand.Connection.OpenAsync();
_ = await sqlCommand.ExecuteNonQueryAsync();
 
int result = (int)sqlCommand.Parameters["@result"].Value; // выходной параметр
 
if (result == 0)
{
    order.OrderID = (int)sqlCommand.Parameters["@idNew"].Value;
 
    return true;
}
else
{
    return false;
}
Добавлено через 1 минуту
_tester_, Вот сама ХП из примера
T-SQL
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
CREATE PROC [dbo].[spBROMTOInsertOrder]
    @idDraw int,
    @idBranch int,
    @idEObject int,
    @oNumber nvarchar(50),
    @oDate datetime,
    @idNew int OUT,
    @result int OUT
AS
BEGIN
    SET NOCOUNT ON
 
    DECLARE @count int
 
    SELECT 
        @count = COUNT(*) 
    FROM 
        dbo.tblBROMTOOrders o
    WHERE 
        o.ONumber = @oNumber
        AND
        o.ID_Branch = @idBranch
        AND
        o.ID_EObject = @idEObject
 
    IF @count = 0
    BEGIN
        INSERT INTO dbo.tblBROMTOOrders
            (ID_Draw, ID_Branch, ID_EObject, ONumber, ODate)
        VALUES
            (@idDraw, @idBranch, @idEObject, @oNumber, @oDate)
 
        SET @idNew = SCOPE_IDENTITY()
 
        SET @result = 0
    END
    ELSE
    BEGIN
        SET @result = 1
    END
 
    SET NOCOUNT OFF
END
0
1 / 1 / 1
Регистрация: 19.04.2018
Сообщений: 101
09.07.2024, 16:47  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
запускается через await? Если запущено без него, то задача улетит вникуда... Это раз, второе - где в этом методе вызов асинхронного метода? В чём смысл async?
этого вопроса я и боялся...Execute() без async нельзя использовать, а вот куда тут впихнуть await я просто не знаю

Добавлено через 1 минуту
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Если уж очень нужно посмотреть как ХП отработает
менять ХП я не могу, она чужая
0
 Аватар для Andrey-MSK
3346 / 2233 / 387
Регистрация: 14.08.2018
Сообщений: 7,537
Записей в блоге: 4
09.07.2024, 16:51
_tester_, У провайдера FireBird есть асинхронные варианты методов, как у меня в примере?

Добавлено через 3 минуты
_tester_, Если нет, делайте через await Task.Run(), что-то типа такого
C#
1
2
3
4
5
6
7
8
9
10
await Task.Run(() =>
{
    using (OleDbConnection excelConnection = new OleDbConnection(excelConnectionString))
    {
        using (OleDbDataAdapter oleDbDataAdapter = new OleDbDataAdapter(excelQuery, excelConnection))
        {
            _ = oleDbDataAdapter.Fill(excelDataTable);
        }
    }
});
0
1 / 1 / 1
Регистрация: 19.04.2018
Сообщений: 101
09.07.2024, 16:59  [ТС]
так?
C#
1
2
3
4
5
6
7
8
private class Job : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
            var mc = new Form1();
            await Task.Run(() => mc.GoFolging());
    }
}
0
 Аватар для Andrey-MSK
3346 / 2233 / 387
Регистрация: 14.08.2018
Сообщений: 7,537
Записей в блоге: 4
09.07.2024, 17:15
_tester_, Можно метод с доступом к БД сделать асинхронным... Пробуйте...
0
1 / 1 / 1
Регистрация: 19.04.2018
Сообщений: 101
09.07.2024, 17:27  [ТС]
(9) не работает т.к.
Code
1
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления dataGridView не из того потока, в котором он был создан
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
private class Job : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        var mc = new Form1();
        await Task.Run(() => mc.GoFolging());
    }
}
private void GoFolging()
{
        ReadSessionTable();
        FolgingSession();
        ReadSessionTable();
}
private void ReadSessionTable()
{
     ...
                    DataTable dt = new DataTable();
                    FbDataAdapter da = new FbDataAdapter();
 
                    FbCommand cmd = new FbCommand("select * from \"sysSessions\";", fb, transaction);
                    cmd.CommandType = CommandType.Text;
                    FbDataReader dr = cmd.ExecuteReader();
 
                    dt.Load(dr);
                    dataGridView1.DataSource = dt;
 
    ...
}
0
 Аватар для Andrey-MSK
3346 / 2233 / 387
Регистрация: 14.08.2018
Сообщений: 7,537
Записей в блоге: 4
09.07.2024, 17:32
Цитата Сообщение от _tester_ Посмотреть сообщение
не работает т.к.
А кто будет потоки синхронизировать? У UI свой поток и он отличается от потоков Task...

Работайте с данными. Запишите всё в коллекцию, тип BindingList<T>, а потом уже, вне асинхронного метода в главном потоке приложения, привяжите её в DGV.

Или используйте класс SynchronizationContext...
0
1 / 1 / 1
Регистрация: 19.04.2018
Сообщений: 101
10.07.2024, 09:54  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Или используйте класс SynchronizationContext...
а как для данной задачи использовать данный класс?
0
 Аватар для Andrey-MSK
3346 / 2233 / 387
Регистрация: 14.08.2018
Сообщений: 7,537
Записей в блоге: 4
10.07.2024, 10:15
Цитата Сообщение от _tester_ Посмотреть сообщение
а как для данной задачи использовать данный класс?
Объявляете свойство этого типа
C#
1
public SynchronizationContext ViewContext { get; set; }
В обработчике события полной загрузки окна получаете его контекст
C#
1
ViewContext = SynchronizationContext.Current;
И в асинхронном методе работаете с привязанной к элементу UI коллекцией
C#
1
2
3
4
5
6
7
8
ViewContext.Send(_ =>
{
    if (PPGroups.Count > 0)
        PPGroups.Clear();
 
    if (groups.Count > 0)
        groups.ForEach(g => PPGroups.Add(g));
}, null);
0
1 / 1 / 1
Регистрация: 19.04.2018
Сообщений: 101
10.07.2024, 11:36  [ТС]
так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public partial class Form1 : Form
{
    public SynchronizationContext ViewContext { get; set; }
 
    [DisallowConcurrentExecution]
    private class Job : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
                var mc = new Form1();
                mc.ViewContext.Send(a => mc.GoFolging(), null);
 
        }
 
   ...
    }
0
 Аватар для Andrey-MSK
3346 / 2233 / 387
Регистрация: 14.08.2018
Сообщений: 7,537
Записей в блоге: 4
10.07.2024, 11:39
Цитата Сообщение от _tester_ Посмотреть сообщение
так?
Не читаете?
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
И в асинхронном методе работаете с привязанной к элементу UI коллекцией
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.07.2024, 11:39
Помогаю со студенческими работами здесь

Запустить стороннюю программу и дождаться окончания ее работы
Здравствуйте! Скажите как из формы запустить exe файл, форму скрыть и когда закроется этот exe файл форму вернуть обратно?

Как дождаться окончания загрузки страницы через (HttpWebResponse)req.GetResponse
Задача такая. Есть страница со ступенчатой догрузкой, сначала основная страница, потом список данных. ...

Дождаться полного выполнения пула потоков
У меня пул потоков выполняет сортировку временных файлов: for (int i = 1; i &lt; tempFileCount; i++) { ...

Как стартовать несколько потоков и дождаться их выполнения
привет есть 4 метода хочу стартовать их и дождаться когда они все закончат подскажите как реализовать без изобретаия велосипеда ...

Дождаться выполнения Task без Thread.Sleep?
using System; public class Test { public static void Main() { Console.WriteLine(&quot;1&quot;); var task = new...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru