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

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

09.07.2024, 15:34. Показов 856. Ответов 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
3316 / 2203 / 387
Регистрация: 14.08.2018
Сообщений: 7,410
Записей в блоге: 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
3316 / 2203 / 387
Регистрация: 14.08.2018
Сообщений: 7,410
Записей в блоге: 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
3316 / 2203 / 387
Регистрация: 14.08.2018
Сообщений: 7,410
Записей в блоге: 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
3316 / 2203 / 387
Регистрация: 14.08.2018
Сообщений: 7,410
Записей в блоге: 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
3316 / 2203 / 387
Регистрация: 14.08.2018
Сообщений: 7,410
Записей в блоге: 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
3316 / 2203 / 387
Регистрация: 14.08.2018
Сообщений: 7,410
Записей в блоге: 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
3316 / 2203 / 387
Регистрация: 14.08.2018
Сообщений: 7,410
Записей в блоге: 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
3316 / 2203 / 387
Регистрация: 14.08.2018
Сообщений: 7,410
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru