С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407

MySqlConnection.OpenAsync() не работает

20.11.2023, 15:59. Показов 1106. Ответов 17

Студворк — интернет-сервис помощи студентам
Доброго времени суток, пишу на xamarin forms, для подключения к бд использую MySqlConnector, синхронно все запросы работают нормально, решил переписать асинхронно и в строке await con.OpenAsync(); получил исключение IndexOutOfRangeException, смотрел подобные проблемы(туттут) и судя по всему проблема в xamarin forms, но возможно кто-то знает что с этим можно сделать, хотелось бы все-таки с базой работать асинхронно.
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
42
43
public async static Task<User> CheckLogin(string login, string password)
{
    User user = null;
    string sql = @"SELECT 
                        id, login, password, first_name, middle_name, last_name
                    FROM
                        qrbd.user
                    WHERE
                        login = @Login AND password = @Password;";
    try
    {
        using (MySqlConnection con = new MySqlConnection(connStr))
        {
            await con.OpenAsync();
            using (MySqlCommand command = new MySqlCommand(sql, con))
            {
                command.Parameters.AddWithValue("Login", login);
                command.Parameters.AddWithValue("Password", Hash.GetHashText(password));
 
                using (MySqlDataReader reder = await command.ExecuteReaderAsync())
                {
                    while (await reder.ReadAsync())
                    {
                        user = new User
                        {
                            Id = reder.GetInt32(0),
                            Login = reder.GetString(1),
                            Password = reder.GetString(2),
                            FirstName = reder.GetString(3),
                            MiddleName = reder.GetString(4),
                            LastName = reder.GetString(5)
                        };
                    }
                }
            }
        }
        return user;
    }
    catch (Exception ex) 
    {
        throw new ApplicationException();
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2023, 15:59
Ответы с готовыми решениями:

Не подключается к БД при использовании .OpenAsync()
Здравствуйте! Имею метод, который должен обращаться к локальной БД и читать из неё данные. Временно пришлось реализовать его не...

Как запустить ExecuteNonQueryAsync и SqlConnection.OpenAsync
Если просто изменить названия команд в программе не работает.

MySqlConnection ssh-туннелирование
try { //string ConnetStr = &quot;SERVER=login.mysql:3306...

17
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
20.11.2023, 17:32
Цитата Сообщение от firnen_dragon Посмотреть сообщение
судя по всему проблема в xamarin forms
А в консольном приложении работает?


Цитата Сообщение от firnen_dragon Посмотреть сообщение
C#
1
command.Parameters.AddWithValue("Login", login);
Ну и название параметра должно быть одинаковым, как в запросе
C#
1
command.Parameters.AddWithValue("@Login", login);
1
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,016
21.11.2023, 05:57
Цитата Сообщение от firnen_dragon Посмотреть сообщение
и в строке await con.OpenAsync(); получил исключение IndexOutOfRangeException
А точно ли такое исключение и на этой строке? Очень странно звучит.

И не понятно зачем логин и пароль из базы вытаскивать, если на момент формирования запроса они уже известны.
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
21.11.2023, 10:23  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А в консольном приложении работает?
Ну я на wpf так писал, и не было такого исключения, попробую еще сейчас в консольном написать, но думаю результат будет тот же.
Цитата Сообщение от Usaga Посмотреть сообщение
А точно ли такое исключение и на этой строке? Очень странно звучит.
Прикрепил скрины пошаговой отладки, там видно что сразу после этой строки в cach вылетает и пишет IndexOutOfRangeException, я сам не очень понимаю причем тут OutOfRange, но вроде как именно эта строка
Миниатюры
MySqlConnection.OpenAsync() не работает   MySqlConnection.OpenAsync() не работает   MySqlConnection.OpenAsync() не работает  

0
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,016
21.11.2023, 10:35
firnen_dragon, а сам это метод как вызывается? С await'ом? Строка подключения не кривая?
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
21.11.2023, 10:49  [ТС]
Usaga,
Вызываю вот так:
C#
1
2
3
4
5
6
7
public async void Login(string login, string password)
{
       if (!string.IsNullOrEmpty(login) && !string.IsNullOrEmpty(password))
      {
            user = await MySQL.CheckLogin(login, password);
      }
}
Со строкой подключения точно все норм, потому что синхронно все работает.
Andrey-MSK, В консольном проверил, все работает
0
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,016
21.11.2023, 10:53
Цитата Сообщение от firnen_dragon Посмотреть сообщение
async void
Такую сигнатуру можно использовать только в обработчиках событий от UI. Как метод Login вызывается? Выглядит, будто он руками дёргается.
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
21.11.2023, 10:57  [ТС]
Usaga, Вызывается в VM командой:
C#
1
2
public ICommand LoginComm { get { return new RelayCommand(OnLogin); } }
public void OnLogin() => model.Login(Username, Password);
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
21.11.2023, 11:26
firnen_dragon, В команде асинхронный метод вызывается вот так
C#
1
2
private async void SaveWorkMeasureExecuted(object obj)
    => await SaveWorkMeasureAsync();
Метод должен быть не void, а Task.

Добавлено через 2 минуты
firnen_dragon, Полный текст команды с методом
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
42
43
44
45
private RelayCommand _saveWorkMeasureCommand;
 
private async void SaveWorkMeasureExecuted(object obj)
    => await SaveWorkMeasureAsync();
private bool SaveWorkMeasureCanExecute(object obj)
    => SelectedWorks.Count > 0 && SelectedMeasure != null;
 
public RelayCommand SaveWorkMeasureCommand
    => _saveWorkMeasureCommand ??= new RelayCommand(SaveWorkMeasureExecuted, SaveWorkMeasureCanExecute);
 
private async Task SaveWorkMeasureAsync()
{
    try
    {
        List<int> positions = new List<int>();
 
        foreach (WorkDrawData work in SelectedWorks)
            positions.Add(work.IDDrawSpec);
 
        int counter = await _mainDA.SpecialDA.SetWorkMeasureAsync(SelectedMeasure, positions);
 
        ViewContext.Post(vc =>
        {
            foreach (int i in positions)
            {
                foreach (WorkDrawData work in Works)
                {
                    if (i == work.IDDrawSpec)
                    {
                        work.MeasureID = SelectedMeasure.MeasureID;
                        work.Measure = SelectedMeasure.MeasureName;
                    }
                }
            }
        }, null);
 
        string message = string.Format("Обработано записей: {0}", counter);
 
        _windowService.ShowInfoMessage(message, "Обновление данных");
    }
    catch (Exception ex)
    {
        _windowService.ShowErrorMessage(ex.Message, "Ошибка");
    }
}
1
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,016
21.11.2023, 11:33
Цитата Сообщение от firnen_dragon Посмотреть сообщение
public void OnLogin() => model.Login(Username, Password);
Вот и ошибка.

Должно быть иначе:
C#
1
public async void OnLogin() => await model.Login(Username, Password);
Добавлено через 31 секунду
Причём метод Login должен возвращать Task.
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
21.11.2023, 11:43  [ТС]
Andrey-MSK, Спасибо, есть вопрос, а можно не передавать object obj, чтоб это был Action у меня просто RelayCommand принимает только Action ? И, если не трудно объясните зачем нужно передавать object obj?

Добавлено через 8 минут
Usaga, Эх, все равно то же исключение
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
21.11.2023, 11:44
Цитата Сообщение от firnen_dragon Посмотреть сообщение
И, если не трудно объясните зачем нужно передавать object obj?
Ну у меня реализация RelayCommand() такая.
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
21.11.2023, 14:32  [ТС]
Ща попробую на wpf написать то же самое, если будет работать, то видимо не судьба мне асинхронно с базой работать на мобилках

Добавлено через 2 часа 45 минут
Мда, переписал я на wpf и все работает ,без исключений, что ж не очень-то хорошие новости, может для мобилок есть какие-то другие конекторы? неужели все синхронно пишут...
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
21.11.2023, 14:46
firnen_dragon, Вот это читали? Набор средств сообщества Xamarin AsyncCommand
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
21.11.2023, 15:03  [ТС]
Andrey-MSK, прочитал, установил CommunityToolkit, изменил команду на
C#
1
2
public IAsyncCommand LoginComm { get { return new AsyncCommand(OnLogin); } }
private async Task OnLogin() => await model.Login(Username, Password);
То же исключение
0
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,016
23.11.2023, 05:43
firnen_dragon, я думаю, что дальнейшее обсуждение будет непродуктивным. Нужен архив (zip) с минимальным проектом, где эта проблема воспроизводится.

Чтобы люди своими глазами могли увидеть и попробовать раздуплиться с происходящим. Просто выглядит как мистика. Возможно тут нужен батюшка с кадилом.
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
23.11.2023, 12:07  [ТС]
Usaga, Согласен, написал минимальный пример
Вложения
Тип файла: zip AsyncMyslApp.zip (24.16 Мб, 0 просмотров)
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
24.11.2023, 09:48
Цитата Сообщение от firnen_dragon Посмотреть сообщение
И, если не трудно объясните зачем нужно передавать object obj?
Удобно для организации ветвления в командах в зависимости от передаваемого параметра. Вот пример
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
private RelayCommand _gplansEditDialogCommand;
 
private void GPlansEditDialogExecuted(object obj)
    => GPlansEditDialog(obj);
private static bool GPlansEditDialogCanExecute(object arg)
    => arg != null;
    
public RelayCommand GPlansEditDialogCommand
    => _gplansEditDialogCommand ??= new RelayCommand(GPlansEditDialogExecuted, GPlansEditDialogCanExecute);
 
private void GPlansEditDialog(object obj)
{
    // В зависимости от параметра команды выполняем что надо
    if (obj is EObject)
    {
        IGPlansDialogVM vm = _viewModelFactory.CreateViewModel<IGPlansDialogVM>();
 
        vm.CurrentEObject = SelectedEObject;
 
        _windowService.ShowDialog(vm);
    }
    else if (obj is GPReport)
    {
        int index = GPReports.IndexOf(GPReports.FirstOrDefault(r => r.GPlanID == SelectedGPReport.GPlanID));
 
        IGPlanEditDialogVM vm = _viewModelFactory.CreateViewModel<IGPlanEditDialogVM>();
 
        vm.EditGPlan = new GPlan
        {
            EObjectID = SelectedGPReport.EObjectID,
            GPlanID = SelectedGPReport.GPlanID,
            KKS = SelectedGPReport.KKS,
            GPlanName = SelectedGPReport.GPlanName
        };
 
        _windowService.ShowDialog(vm);
 
        if (vm.DialogResult == true)
        {
            GPReport report = new GPReport
            {
                EObjectID = SelectedGPReport.EObjectID,
                GPlanID = SelectedGPReport.GPlanID,
                KKS = vm.EditGPlan.KKS,
                GPlanName = vm.EditGPlan.GPlanName,
                TotalWeight = SelectedGPReport.TotalWeight,
                TotalLabor = SelectedGPReport.TotalLabor,
                ErectedWeight = SelectedGPReport.ErectedWeight,
                ErectedLabor = SelectedGPReport.ErectedLabor,
                RemainWeight = SelectedGPReport.RemainWeight,
                RemainLabor = SelectedGPReport.RemainLabor
            };
 
            GPReports[index] = report;
 
            SelectedGPReport = GPReports.FirstOrDefault(g => g.GPlanID == report.GPlanID);
        }
    }
}
И в разметке
XML
1
2
3
4
5
6
7
8
9
10
<!-- С одним параметром -->
<MenuItem Header="Объекты Генплана" 
            Command="{Binding GPlansEditDialogCommand}"
            CommandParameter="{Binding SelectedEObject}"
            VerticalContentAlignment="Center"/>
            
<!-- С другим параметром -->
<MenuItem Header="Редактировать объект"
          Command="{Binding GPlansEditDialogCommand}"
          CommandParameter="{Binding SelectedGPReport}"/>
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.11.2023, 09:48
Помогаю со студенческими работами здесь

Присвоить значение в using(MySqlConnection){}
Есть следующий код: public bool Authorize(string login, string password) { credentials.Authorized =...

Как скрыть строку MySqlConnection
Всем привет, подскажите как можно спрятать или скрыть от чужих глаз строку подключения к MySql Бд? MySqlConnection connection = new...

MySqlConnection, несколько запросов одновременно
В общем написал вот такой класс для сервера, заметил что если не освободить ресурсы то MySqlConnection выдаёт ошибку, поэтому возник...

MySqlConnection.state не изменяется по событию
Доброго дня. Есть такой очень примитивный кусок кода if (MyConnect.State != System.Data.ConnectionState.Open) { ...

Ошибка MySqlConnection, void cannot be as argument type
Здравствуйте. Помогите пожалуйста разобраться с ошибкой MySqlConnection. Вот код void WriteEvent(String^ type, String^ component,...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru