Доступ к данным 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 и за те возможности что есть.

ссылка на оригинал статьи https://habrahabr.ru/post/277655/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *