Доступ к данным MySQL из приложения UWP без использования сервисов



    В приложениях Windows Store и в приложениях UWP для доступа к хранящимся в сети базам данных необходимо использовать web-сервисы. Если вы используете базы данных Azure, то вы можете использовать такой сервис как Azure Mobile Apps

    Давайте, я научу вас «плохому» и расскажу о том, как можно в приложении UWP получить доступ к данным из MySQL базы напрямую с помощью Connector/Net. Код будет идентичен и для .Net WPF приложений.



    Использование прямого доступа к данным не рекомендуется по очевидным причинам. Строка подключения хранится в приложении, поэтому каждый, кто скачает приложение, потенциально может получить доступ к строке. Отчасти поэтому в приложениях UWP отсутствуют определенные возможности для работы с данными напрямую. Кроме того, обновление логики сервиса сразу же затронет все привязанные к нему приложения, тогда как заставить всех пользователей мгновенно обновить приложение не получится.

    Зачем использовать не рекомендуемый способ? Можно найти некоторые кейсы использования. Мне, например, в голову пришел вариант создания приложения админки базы MySQL для удобного редактирования записей с телефона. Конечно, есть еще и вариант создать пользователя с правами только на чтение. В некоторых случаях им можно воспользоваться, несмотря на то, что в строке подключения компрометируется имя сервера и базы данных. Альтернативно, можно заставлять пользователя вводить данные необходимые для авторизации каждый раз.

    В качестве подопытной базы данных я использую облачную базу MySQL от ClearDB, которую можно создать в Azure. Обладатели бесплатного студенческого аккаунта DreamSpark, могут создать такую базу бесплатно. Впрочем, способ, который я описываю подходит к любым базам MySQL, а не только к базам развернутым в облаке Azure.

    Создается база довольно просто. На новом портале Azure в меню нажимаем плюсик, выбираем «Данные+хранилище» — «База данных MySQL», задаем название базе, настраиваем параметры и соглашаемся с условиями.



    Буквально через минуту база будет развернута.



    Теперь в свойствах можно будет найти строку подключения.



    Как я уже упоминал, для работы с базой MySQL нам необходим Connector/Net.

    На момент написания примера, NuGet выдал по поиску MySQL.Net Connector/Net версии 6.6.4
    А на сайте mysql Chapter 2 Connector/Net Versions указано, что WinRT приложения поддерживаются, начиная с версии 6.7
    Значит, придется скачивать инсталлятор с официального сайта: Download Connector/Net

    При установке с помощью инсталлятора будет предложено установить примеры на C# и VB. Примеры оказались на .Net версии 2.0, поэтому мне они показались не особо актуальны (у меня даже .Net этой версии оказался не установлен).

    Перейдем к созданию приложения. В Visual Studio создаем проект универсального приложения Windows. Добавляем в него ссылку на библиотеку MySql.Data.RT.dll, которая должна находиться по адресу
    C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\Assemblies\RT\
    Официально UWP еще не поддерживается, но WinRT библиотека вполне подходит для универсальных приложений (ведь UWP основана на WinRT API, хотя и не все из WinRT доступно или используется в UWP).

    Если у вас WPF приложение, то вам необходима библиотека
    C:\Program Files\MySQL\MySQL Connector Net 6.9.8\Assemblies\v4.5\MySql.Data.dll

    В манифесте универсального приложения нужно добавить возможность использования интернета — Internet (Client). Обычно эта возможность установлена по умолчанию, так что достаточно зайти и проверить, что галочка стоит в нужном месте.

    Можно писать код.
    Пространство имен, в котором находятся классы MySQL это MySql.Data.MySqlClient. Добавим его для того, чтобы каждый раз не упоминать в коде:

    using MySql.Data.MySqlClient;
    

    Для начала, пример того, как можно создать таблицу и внести в нее данные:

       using (MySqlConnection connection = new MySqlConnection("Database=as_bfb6f501597b777;Data Source=us-cdbr-azure-west-c.cloudapp.net;User Id=b74038821f5aea;Password=2564f4e5;SslMode=None;"))
     {
       connection.Open();
    
       MySqlCommand createCommand = new MySqlCommand("CREATE TABLE demotable(salary int,surname varchar(255))", connection);
       createCommand.ExecuteNonQuery();
    
       MySqlCommand addCommand = new MySqlCommand("INSERT INTO demotable (salary,surname) VALUES (1234,'Вейдер')", connection);
       addCommand.ExecuteNonQuery();
      }
    

    Здесь я создал таблицу с названием demotable с двумя полями – salary и surname и внес в нее строку со значениями фамилии и зарплаты. Сотрудник с фамилией Вейдер получит за службу по заслугам 1234.
    Обратите внимание на строку подключения. Ее мы взяли с портала. В конце необходимо добавить "SslMode=None;", так как Connector/Net не поддерживает пока что SSL.

    Теперь простенький пример считывания данных.
    Нам нужно создать класс модели с такими же полями, какие есть в нашей базе. Делаем это так:

        public class CloudTable
        {
            private string _surname;
            public string surname
            {
                get { return _surname; }
                set { _surname = value; }
            }
    
            private int _salary;
            public int salary
            {
                get { return _salary; }
                set { _salary = value; }
            }
        }
    

    Далее можно в коде нашей страницы объявить коллекцию:

      public ObservableCollection<CloudTable> demodata = new ObservableCollection<CloudTable>();
    

    Данные будем отображать в ListView. XAML код пусть будет такой:

            <ListView x:Name="myListView" Width="400" Height="400" 
                                       Margin="20,20,0,0" ItemsSource="{Binding}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Path=surname}"></TextBlock>
                            <TextBlock Text="{Binding Path=salary}"></TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
    

    Как вы можете заметить я не сильно заморачивался и шаблон отображения элемента списка сделал просто в виде панели, внутри которой расположены 2 текстовых блока. Значения текста блоков привязаны к значениям surname и salary из контекста данных. Контекст данных мы зададим в коде C#. Можно при желании дизайн получше сделать, конечно.

    Сам код для считывания данных в коллекцию и привязки их к ListView такой:

        using (MySqlConnection connection = new MySqlConnection("Database=as_bfb6f501597b777;Data Source=us-cdbr-azure-west-c.cloudapp.net;User Id=b74038821f5aea;Password=2564f4e5;SslMode=None;"))
      {
         connection.Open();
         MySqlCommand readCommand = new MySqlCommand("SELECT * FROM demotable", connection);
    
         using (MySqlDataReader reader = readCommand.ExecuteReader())
         {
            while (reader.Read())
             {
                demodata.Add(new CloudTable { surname = reader.GetString(1), salary = reader.GetInt32(0) });
             }
         }
     }
        myListView.DataContext = demodata;
    

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

    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое