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

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

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

Author24 — интернет-сервис помощи студентам
Доброе.
Вызываю хранимую процедуру
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2024, 15:34
Ответы с готовыми решениями:

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

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

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

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

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

15
2861 / 1980 / 368
Регистрация: 14.08.2018
Сообщений: 6,422
Записей в блоге: 4
09.07.2024, 15:54 2
Цитата Сообщение от _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  [ТС] 3
Почему спрашиваю, дело вот в чем, ХП выполняется где то секунд 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
2861 / 1980 / 368
Регистрация: 14.08.2018
Сообщений: 6,422
Записей в блоге: 4
09.07.2024, 16:13 4
Цитата Сообщение от _tester_ Посмотреть сообщение
т.е. код н е ждет собственно окончания выполнения ХП
Не может быть
Выполняет для подключения инструкцию Transact-SQL и возвращает количество задействованных в инструкции строк.
SqlCommand.ExecuteNonQuery Метод
0
1 / 1 / 1
Регистрация: 19.04.2018
Сообщений: 101
09.07.2024, 16:36  [ТС] 5
выяснилось следующее: При прямом запуске процедуры при нажатии на кнопку все работает как надо:
C#
1
2
3
4
5
6
7
8
9
private void button1_Click(object sender, EventArgs e)
{
    GoFolging();
}
 
private void GoFolging()
{
       FolgingSession();
}
и лог правильный
Код
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();
    }
}
При запуске же по расписанию лог такой:
Код
16:24:00 9 июля 2024 г. begin Folging Session
16:24:03 9 июля 2024 г. Open DB for Sessions table
т.е. ХП не заняло ничего
0
2861 / 1980 / 368
Регистрация: 14.08.2018
Сообщений: 6,422
Записей в блоге: 4
09.07.2024, 16:43 6
_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  [ТС] 7
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
запускается через await? Если запущено без него, то задача улетит вникуда... Это раз, второе - где в этом методе вызов асинхронного метода? В чём смысл async?
этого вопроса я и боялся...Execute() без async нельзя использовать, а вот куда тут впихнуть await я просто не знаю

Добавлено через 1 минуту
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Если уж очень нужно посмотреть как ХП отработает
менять ХП я не могу, она чужая
0
2861 / 1980 / 368
Регистрация: 14.08.2018
Сообщений: 6,422
Записей в блоге: 4
09.07.2024, 16:51 8
_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  [ТС] 9
так?
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
2861 / 1980 / 368
Регистрация: 14.08.2018
Сообщений: 6,422
Записей в блоге: 4
09.07.2024, 17:15 10
_tester_, Можно метод с доступом к БД сделать асинхронным... Пробуйте...
0
1 / 1 / 1
Регистрация: 19.04.2018
Сообщений: 101
09.07.2024, 17:27  [ТС] 11
(9) не работает т.к.
Код
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 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
2861 / 1980 / 368
Регистрация: 14.08.2018
Сообщений: 6,422
Записей в блоге: 4
09.07.2024, 17:32 12
Цитата Сообщение от _tester_ Посмотреть сообщение
не работает т.к.
А кто будет потоки синхронизировать? У UI свой поток и он отличается от потоков Task...

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

Или используйте класс SynchronizationContext...
0
1 / 1 / 1
Регистрация: 19.04.2018
Сообщений: 101
10.07.2024, 09:54  [ТС] 13
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Или используйте класс SynchronizationContext...
а как для данной задачи использовать данный класс?
0
2861 / 1980 / 368
Регистрация: 14.08.2018
Сообщений: 6,422
Записей в блоге: 4
10.07.2024, 10:15 14
Цитата Сообщение от _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  [ТС] 15
так?
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
2861 / 1980 / 368
Регистрация: 14.08.2018
Сообщений: 6,422
Записей в блоге: 4
10.07.2024, 11:39 16
Цитата Сообщение от _tester_ Посмотреть сообщение
так?
Не читаете?
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
И в асинхронном методе работаете с привязанной к элементу UI коллекцией
0
10.07.2024, 11:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2024, 11:39
Помогаю со студенческими работами здесь

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

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

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

Как дождаться выполнения скрипта от invokescript в webbrowser
Т.е. дождаться выполнения скрипта вызванного invokescript! Вот мой код: ...

Как дождаться выполнения Task.Run из контроллера
У меня есть задача, которая делает счет наперед в отдельном методе контроллера. Также у меня есть...

Дождаться окончания выполнения скрипта
В скрипте открывается файл для записи, в него через цикл записываются данные, затем файл...


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

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