RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 6. Connector/NET: обучающие программы

Следующие обучающие программы MySQL Connector/NET иллюстрируют, как разработать программы MySQL, используя такие технологии, как Visual Studio, C#, ASP.NET и .NET, .NET Core и Mono framework. Начните с первой обучающей программы, которая проверит, что вы установили правильные компоненты программного обеспечения, затем выберите другие обучающие программы, чтобы попробовать в зависимости от функций, которые вы намереваетесь использовать в ваших приложениях.

6.1. Введение в Connector/NET

Эта секция обеспечивает введение в программирование на MySQL Connector/NET. Пример кода написан на C# и разработан, чтобы работать с Microsoft .NET Framework и Mono.

Эта обучающая программа разработана, чтобы начать работу с Connector/NET как можно быстрее, это не вдается в подробности ни по какой конкретной теме. Однако следующие разделы этого руководства описывают каждую из тем, введенных в этой обучающей программе более подробно. В этой обучающей программе вы поощряетесь править код, изменяя его как требуется для вашей установки.

Эта обучающая программа предполагает, что у вас уже есть MySQL и Connector/NET. Это также предполагает, что вы установили образец базы данных world, который может быть загружен с MySQL Documentation page. Можно также найти детали о том, как установить базу данных на той же самой странице.

Прежде, чем собрать пример кода, удостоверьтесь, что вы добавили ссылки на свой проект как требуется. Требуемые ссылки: are System, System.Data и MySql.Data.

6.1.1. Объект MySqlConnection

Чтобы приложение MySQL Connector/NET могло соединиться с базой данных MySQL, это должно установить связь при помощи объекта MySqlConnection.

Конструктор MySqlConnection берет строку подключения в качестве одного из параметров. Строка подключения предоставляет необходимую информацию, чтобы установить связь с базой данных MySQL. Строка подключения обсуждена более полно в разделе 4.5.

Следующий код показывает, как создать объект связи.

using System;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;

public class Tutorial1
{
  public static void Main()
  {
    string connStr = "server=localhost;user=root;database=world;port=3306;password=******";
    MySqlConnection conn = new MySqlConnection(connStr);
    try
    {
      Console.WriteLine("Connecting to MySQL...");
      conn.Open();
      // Perform database operations
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.ToString());
    }
    conn.Close();
    Console.WriteLine("Done.");
  }
}

Когда вызван конструктор MySqlConnection, он возвращает объект связи, который используется для последующих операций по базе данных. Откройте связь, прежде чем любые другие операции произойдут. Перед завершением приложения закройте связь с базой данных, вызвав на объекте связи Close.

Иногда попытка вызвать Open на объекте связи может потерпеть неудачу, произведя исключение, которое может быть обработано, используя стандартный код обработки исключений.

В этой секции вы изучили, как создать связь с базой данных MySQL, открыть и закрыть соответствующий объект связи.

6.1.2. Объект MySqlCommand

Когда связь была установлена с базой данных MySQL, следующий шаг проводит желаемые операции по базе данных. Это может быть достигнуто с помощью объекта MySqlCommand.

Вы будете видеть, как создать объект MySqlCommand. После того, как это было создано, есть три основных метода, которые можно вызвать:

  • ExecuteReader, чтобы запросить базу данных. Результаты обычно возвращаются в объекте MySqlDataReader, созданном ExecuteReader.

  • ExecuteNonQuery, чтобы вставить, обновить и удалить данные.

  • ExecuteScalar, чтобы возвратить единственное значение.

Когда объект MySqlCommand был создан, вы вызовете один из предыдущих методов на нем, чтобы провести операцию по базе данных Результаты обычно возвращаются в объекте MySqlDataReader, а затем обрабатываются, например, результат мог бы быть показан. Следующий код демонстрирует, как это могло быть сделано.

using System;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;

public class Tutorial2
{
  public static void Main()
  {
    string connStr = "server=localhost;user=root;database=world;port=3306;password=******";
    MySqlConnection conn = new MySqlConnection(connStr);
    try
    {
      Console.WriteLine("Connecting to MySQL...");
      conn.Open();
      string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent='Oceania'";
      MySqlCommand cmd = new MySqlCommand(sql, conn);
      MySqlDataReader rdr = cmd.ExecuteReader();
      while (rdr.Read())
      {
        Console.WriteLine(rdr[0]+" -- "+rdr[1]);
      }
      rdr.Close();
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.ToString());
    }
    conn.Close();
    Console.WriteLine("Done.");
  }
}

Когда связь была создана и открыта, код создает объект MySqlCommand. Тогда SQL-запрос, который будет выполнен, передается конструктору MySqlCommand. Метод ExecuteReader используется, чтобы произвести объект MySqlReader. Объект MySqlReader содержит результаты, произведенные SQL, выполненным на объекте. Как только результаты были получены в объекте MySqlReader, результаты могут быть обработаны. В этом случае информация распечатывается циклом while. Наконец от объекта MySqlReader избавляются, вызывая метод Close.

В следующем примере вы будете видеть, как использовать метод ExecuteNonQuery.

Процедура выполнения вызова метода ExecuteNonQuery проще, поскольку нет никакой потребности создать объект, чтобы сохранить результаты. Это потому, что ExecuteNonQuery используется только для вставки, обновления и удаления данных. Следующий пример иллюстрирует простое обновление таблицы Country:

using System;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;

public class Tutorial3
{
  public static void Main()
  {
    string connStr = "server=localhost;user=root;database=world;port=3306;password=******";
    MySqlConnection conn = new MySqlConnection(connStr);
    try
    {
      Console.WriteLine("Connecting to MySQL...");
      conn.Open();
      string sql = "INSERT INTO Country (Name, HeadOfState, Continent) VALUES ('Disneyland','Mickey Mouse', 'North America')";
      MySqlCommand cmd = new MySqlCommand(sql, conn);
      cmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.ToString());
    }
    conn.Close();
    Console.WriteLine("Done.");
  }
}

Запрос построен, создан объект команды и метод ExecuteNonQuery обратился к объекту команды. Можно получить доступ к базе данных MySQL интерпретатором команд mysql и проверить, что обновление было выполнено правильно.

Наконец, вы будете видеть как метод ExecuteScalar может использоваться, чтобы возвратить единственное значение. Снова объект MySqlDataReader не требуется, чтобы хранить результаты, простая переменная это сделает. Следующий код иллюстрирует, как использовать ExecuteScalar:

using System;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;

public class Tutorial4
{
  public static void Main()
  {
    string connStr = "server=localhost;user=root;database=world;port=3306;password=******";
    MySqlConnection conn = new MySqlConnection(connStr);
    try
    {
      Console.WriteLine("Connecting to MySQL...");
      conn.Open();
      string sql = "SELECT COUNT(*) FROM Country";
      MySqlCommand cmd = new MySqlCommand(sql, conn);
      object result = cmd.ExecuteScalar();
      if (result != null)
      {
         int r = Convert.ToInt32(result);
         Console.WriteLine("Number of countries in the world database is: " + r);
      }
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.ToString());
    }
    conn.Close();
    Console.WriteLine("Done.");
  }
}

Этот пример использует простой запрос, чтобы включить строки в таблице Country. Результат получен, вызывая ExecuteScalar на объекте команды.

6.1.3. Работа с расцепленными данными

Ранее, используя MySqlDataReader, связь с базой данных все время сохранялась, если явно не закрыта. Также возможно работать способом, где связь устанавливается только при необходимости. Например, в этом способе, связь могла быть установлена, чтобы прочитать кусок данных, данные тогда могли быть изменены приложением как требуется. Связь тогда могла быть восстановлена, только если и когда приложение написало данные в ответ базе данных. Это отцепляет рабочий набор данных от базы данных.

Этот расцепленный способ работы с данными поддерживается MySQL Connector/NET. Есть несколько частей, вовлеченных в работу этого метода:

  • Набор данных. Набор данных это область, в которой данные загружаются, чтобы прочитать или изменить. Объект DataSet экземплируется, который может сохранить многократные таблицы данных.

  • Адаптер данных. Адаптер данных это интерфейс между набором данных и самой базой данных. Адаптер данных ответственен за эффективное управление связью с базой данных, открывая и закрывая их как требуется. Адаптер данных создается, экземплируя объект класса MySqlDataAdapter. Объект MySqlDataAdapter имеет два основных метода: Fill, который читает данные в набор данных и Update, который пишет данные из набора данных в базу данных.

  • Строитель команды. Строитель команды это объект поддержки. Строитель команды работает вместе с адаптером данных. Когда MySqlDataAdapter создается, ему, как правило, дают начальный оператор SELECT. От этого SELECT строитель команды может разработать передачу запросов INSERT, UPDATE и DELETE, которые потребовались бы, чтобы обновлять базу данных. Чтобы создать строителя команды, надо создать объект класса MySqlCommandBuilder.

Каждый из этих классов будет теперь обсужден более подробно.

Слздание объекта DataSet

Объект DataSet может быть создан просто, как показано в следующем фрагменте кода:

DataSet dsCountry;
...
dsCountry = new DataSet();

Хотя это создает объект DataSet, это еще не наполнило его данными. Для этого требуется адаптер данных.

Создание объекта MySqlDataAdapter

MySqlDataAdapter может быть создан, как иллюстрировано следующим примером:

MySqlDataAdapter daCountry;
...
string sql = "SELECT Code, Name, HeadOfState FROM Country
              WHERE Continent='North America'";
daCountry = new MySqlDataAdapter (sql, conn);

MySqlDataAdapter дан SQL-определением данных.

Создание объекта MySqlCommandBuilder

Когда создан MySqlDataAdapter, необходимо произвести дополнительные запросы, требуемые для вставки, обновления и удаления данных. Есть несколько способов сделать это, но в этой обучающей программе вы будете видеть, как это может быть сделано наиболее легко с MySqlCommandBuilder. Следующий фрагмент кода иллюстрирует, как это сделано:

MySqlCommandBuilder cb = new MySqlCommandBuilder(daCountry);

Объект MySqlDataAdapter передается в качестве параметра строителю команды.

Заполнение набора данных

Чтобы сделать что-либо полезное с данными из вашей базы данных, необходимо загрузить его в набор данных. Это одна из работ объекта MySqlDataAdapter, выполняется методом Fill. Следующий пример кода иллюстрирует этот тезис.

DataSet dsCountry;
...
dsCountry = new DataSet();
...
daCountry.Fill(dsCountry, "Country");

Метод Fill это метод MySqlDataAdapter и Data Adapter знает, как установить связь с базой данных, получить необходимые данные и затем наполнить набор данных, когда вызван метод Fill. Второй параметр Country является таблицей в наборе данных, чтобы обновить.

Обновление Data Set

Данными в наборе данных может теперь управлять приложение как требуется. В какой-то момент изменения данных должны быть написаны в ответ базе данных. Это достигается через метод Update в MySqlDataAdapter.

daCountry.Update(dsCountry, "Country");

Рабочий пример

Взаимодействия между классами DataSet, MySqlDataAdapter и MySqlCommandBuilder могут быть немного запутывающими, таким образом, их действие, возможно, может быть лучше всего иллюстрировано, работая с кодом.

В этом примере, данные из базы данных world прочитаны в Data Grid View. Здесь, данные могут быть рассмотрены и изменены прежде, чем нажать кнопку обновления. Кнопка обновления тогда активирует код, чтобы написать изменения в ответ базе данных. Код использует принципы, объясненные ранее. Приложение было создано, используя Microsoft Visual Studio, чтобы разместить и создать средства управления пользовательским интерфейсом, но главный код, который использует ключевые классы, описанные ранее, показывают в следующем примере кода.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace WindowsFormsApplication5
{
  public partial class Form1 : Form
  {
    MySqlDataAdapter daCountry;
    DataSet dsCountry;

    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      string connStr = "server=localhost;user=root;database=world;port=3306;password=******";
      MySqlConnection conn = new MySqlConnection(connStr);
      try
      {
        label2.Text = "Connecting to MySQL...";
        string sql = "SELECT Code, Name, HeadOfState FROM Country
                      WHERE Continent='North America'";
        daCountry = new MySqlDataAdapter (sql, conn);
        MySqlCommandBuilder cb = new MySqlCommandBuilder(daCountry);
        dsCountry = new DataSet();
        daCountry.Fill(dsCountry, "Country");
        dataGridView1.DataSource = dsCountry;
        dataGridView1.DataMember = "Country";
      }
      catch (Exception ex)
      {
        label2.Text = ex.ToString();
      }
    }

    private void button1_Click(object sender, EventArgs e)
    {
      daCountry.Update(dsCountry, "Country");
      label2.Text = "MySQL Database Updated!";
    }
  }
}

Следующие данные показывают запущенное приложение. World Database Application обновило данные в трех колонках: Code, Name, и HeadOfState.

Рис. 6.1. World Database Application

Content is described in the surrounding text.

6.1.4. Работа с параметрами

Эта часть обучающей программы показывает вам, как использовать параметры в вашем приложении MySQL Connector/NET.

Хотя возможно построить последовательности SQL-запросов непосредственно из ввода данных пользователем, это нежелательно, поскольку это не предотвращает ошибочную или злонамеренно вводимую информацию. Более безопасно использовать параметры, поскольку они будут обработаны только как полевые данные. Например, предположите, что следующий запрос был построен из ввода данных пользователем:

string sql = "SELECT Name, HeadOfState FROM Country
              WHERE Continent = "+user_continent;

Если последовательность user_continent прибыла из Text Box, потенциально не будет никакого контроля над последовательностью, введенной пользователем. Пользователь мог ввести последовательность, которая производит ошибку выполнения или, в худшем случае, на самом деле вредит системе. Используя параметры невозможно сделать это, потому что параметр рассматривают только как полевой параметр, а не произвольную часть кода SQL.

Тот же самый запрос с использованием параметра для ввода данных пользователем:

string sql = "SELECT Name, HeadOfState FROM Country
              WHERE Continent = @Continent";

Параметру предшествуют символ, чтобы указать, что это нужно рассматривать в качестве параметра.

А также отмечая положение параметра в строке запроса, необходимо добавить параметр к объекту Command. Это иллюстрировано следующим фрагментом кода:

cmd.Parameters.AddWithValue("@Continent", "North America");

В этом примере последовательность "North America" поставляется как значение параметра статически, но в более практическом примере это прибыло бы из ввода данных пользователем.

Дальнейший пример иллюстрирует полный процесс:

using System;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;

public class Tutorial5
{
  public static void Main()
  {
    string connStr = "server=localhost;user=root;database=world;port=3306;password=******";
    MySqlConnection conn = new MySqlConnection(connStr);
    try
    {
      Console.WriteLine("Connecting to MySQL...");
      conn.Open();
      string sql = "SELECT Name, HeadOfState FROM Country
                    WHERE Continent=@Continent";
      MySqlCommand cmd = new MySqlCommand(sql, conn);
      Console.WriteLine("Enter a continent e.g. 'North America', 'Europe': ");
      string user_input = Console.ReadLine();
      cmd.Parameters.AddWithValue("@Continent", user_input);
      MySqlDataReader rdr = cmd.ExecuteReader();
      while (rdr.Read())
      {
        Console.WriteLine(rdr["Name"]+" --- "+rdr["HeadOfState"]);
      }
      rdr.Close();
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.ToString());
    }
    conn.Close();
    Console.WriteLine("Done.");
  }
}

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

6.1.5. Работа с хранимыми процедурами

Эта секция иллюстрирует, как работать с хранимыми процедурами. Помещение интенсивных действий базы данных в хранимые процедуры позволяет вам определить API для своего приложения базы данных. Можно снова использовать этот API много раз. Эта техника избегает дублировать код базы данных, экономя время и усилия, когда вы делаете обновления из-за изменений схемы: настройте исполнение запросов или добавьте новые операции по базе данных для регистрации, безопасности и так далее. Прежде, чем работать с этой обучающей программой, ознакомьтесь с CREATE PROCEDURE и CREATE FUNCTION, которые создают различные виды сохраненного кода.

В целях этой обучающей программы вы создадите простую хранимую процедуру, чтобы видеть, как это можно вызвать из MySQL Connector/NET. В MySQL Client соединитесь с базой данных world и введите следующую хранимую процедуру:

DELIMITER //
CREATE PROCEDURE country_hos (IN con CHAR(20))
BEGIN
  SELECT Name, HeadOfState FROM Country WHERE Continent = con;
END //
DELIMITER ;

Проверьте, что хранимая процедура работает как ожидалось, печатая следующее в mysql:

CALL country_hos('Europe');

Сохраненная процедура берет единственный параметр, который является континентом, чтобы ограничить ваш поиск.

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

Запрос хранимой процедуры из вашего запроса Connector/NET подобен методам, которые вы видели ранее в этой обучающей программе. Объект MySqlCommand создается, но вместо SQL-запроса в качестве параметра, это берет название хранимой процедуры, чтобы вызвать. Установите объект MySqlCommand в тип хранимой процедуры, как показано следующим фрагментом кода:

string rtn = "country_hos";
MySqlCommand cmd = new MySqlCommand(rtn, conn);
cmd.CommandType = CommandType.StoredProcedure;

В этом случае хранимая процедура требует, чтобы вы передали параметр. Это может быть достигнуто, используя методы в предыдущей секции на параметрах, раздел 6.1.4, как показано в следующем фрагменте кода:

cmd.Parameters.AddWithValue("@con", "Europe");

Значение параметра @con, возможно, более реалистично прибыло из ввода данных пользователем, но для простоты он установлен как статическая последовательность в этом примере.

В этом пункте все настраивается и можно вызвать обычные методы использования, также изученные в более ранних секциях. В этом случае применяется метод ExecuteReader.

Следующий код показывает полный пример хранимой процедуры.

using System;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;

public class Tutorial6
{
  public static void Main()
  {
    string connStr = "server=localhost;user=root;database=world;port=3306;password=******";
    MySqlConnection conn = new MySqlConnection(connStr);
    try
    {
      Console.WriteLine("Connecting to MySQL...");
      conn.Open();
      string rtn = "country_hos";
      MySqlCommand cmd = new MySqlCommand(rtn, conn);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.AddWithValue("@con", "Europe");
      MySqlDataReader rdr = cmd.ExecuteReader();
      while (rdr.Read())
      {
        Console.WriteLine(rdr[0] + " --- " + rdr[1]);
      }
      rdr.Close();
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.ToString());
    }
    conn.Close();
    Console.WriteLine("Done.");
  }
}

В этой секции вы видели, как вызвать хранимую процедуру из Connector/NET. В настоящий момент это завершает нашу вводную обучающую программу при программировании для Connector/NET.

6.2. Обучающая программа: Connector/NET ASP.NET членство и ролевой поставщик

Много веб-сайтов показывают средство для пользователя, чтобы создать учетную запись пользователя. Они могут зарегистрироваться на веб-сайте и наслаждаться персонализированным опытом. Это требует, чтобы разработчик создал таблицы базы данных, чтобы хранить пользовательскую информацию, наряду с кодом, чтобы собрать и обработать эти данные. Это представляет проблему разработчику и есть возможность для проблем безопасности. Однако, ASP.NET ввел систему членства. Эта система разработана вокруг понятия членства, профиля и ролевых поставщиков, которые вместе обеспечивают всю функциональность, чтобы осуществить пользовательскую систему, которая ранее была создана разработчиком с нуля.

MySQL Connector/NET включает веб-поставщиков для членства (или простого членства), роли, профиля, состояния сеанса, карты сайта и веб-персонализации.

Эта обучающая программа показывает вам, как настроить ваше веб-приложение ASP.NET, чтобы использовать членство в Connector/NET и ролевых поставщиков. Это предполагает, что вы установили MySQL Server с Connector/NET и Microsoft Visual Studio. Эта обучающая программа была проверена с Connector/NET 6.0.4 и Microsoft Visual Studio 2008 Professional Edition. Рекомендуется, чтобы вы использовали версию 6.0.4 или выше для этой обучающей программы.

  1. Создайте новую базу данных MySQL, используя программу MySQL Client (mysql) или другой подходящий инструмент. Не имеет значения, какое имя используется для базы данных, но сделайте его запись. Вы определяете его в строке подключения, построенной позже в этой обучающей программе. Эта база данных содержит таблицы, автоматически составленные для вас позже, используемые, чтобы хранить данные о пользователях и ролях.

  2. Создайте новый веб-сайт ASP.NET в Visual Studio. Если вы не уверены, как сделать это, обратитесь к разделу 6.7, который демонстрирует, как создать простой веб-сайт ASP.NET.

  3. Добавьте ссылки на MySql.Data и MySql.Web к проекту веб-сайта.

  4. Определите местонахождение файла machine.config на вашей системе, который является конфигурационным файлом для .NET Framework.

  5. Найдите файл machine.config, чтобы найти поставщика членства MySQLMembershipProvider .

  6. Добавьте признак autogenerateschema="true" . Соответствующая секция должна теперь напоминать следующий пример.

    Ради краткости исключена некоторая информация.

    <membership>
      <providers>
        <add name="AspNetSqlMembershipProvider"
          type="System.Web.Security.SqlMembershipProvider"
          ...
          connectionStringName="LocalSqlServer"
          ... />
        <add name="MySQLMembershipProvider" autogenerateschema="true"
          type="MySql.Web.Security.MySQLMembershipProvider,
          MySql.Web, Version=6.0.4.0, Culture=neutral,
          PublicKeyToken=c5687fc88969c44d"
          connectionStringName="LocalMySqlServer"
         ... />
      </providers>
    </membership>
    

    Строка подключения, LocalMySqlServer, соединяется с сервером MySQL, который содержит базу данных членства.

    Атрибут autogenerateschema="true" заставит Connector/NET тихо создавать или модернизировать схему на сервере базы данных, содержащую необходимые таблицаы для того, чтобы хранить информацию членства.

  7. Теперь необходимо создать строку подключения, на которую ссылаются в предыдущем шаге. Загрузите файл web.config для веб-сайта в Visual Studio.

  8. Определите местонахождение секции отмеченной <connectionStrings>. Добавьте следующую информацию о строке подключения.

    <connectionStrings>
      <remove name="LocalMySqlServer"/>
      <add name="LocalMySqlServer"
        connectionString="Datasource=localhost;Database=users;uid=root;pwd=password"
        providerName="MySql.Data.MySqlClient"/>
    </connectionStrings>
    

    Определенная база данных является, созданной в первом шаге. Вы, возможно, альтернативно использовали существующую базу данных.

  9. В этом пункте надо гарантировать, что никакие ошибки не присутствуют. Это может быть сделано выбором Build, Build Solution из главного меню или нажатием F6.

  10. ASP.NET поддерживает понятие локально и удаленно авторизованных пользователей. С локальной аутентификацией пользователь утвержден, используя авторизацию Windows, когда он пытается получить доступ к веб-сайту. Это может быть полезно в интранет-среде. С удаленной аутентификацией пользователь запрошен для ввода данных для входа в систему, получая доступ к веб-сайту, и эти данные сравнены с информацией членства, хранящейся в сервере базы данных, таком как MySQL Server. Вы будете теперь видеть, как выбрать эту форму идентификации.

    Запустите ASP.NET Website Administration Tool. Это может быть сделано быстро, щелкнув по маленькому символу молотка и Земли в Solution Explorer. Можно также запустить этот инструмент, выбрав Website и ASP.NET Configuration из главного меню.

  11. В ASP.NET Website Administration Tool перейдите на вкладку Security и сделайте следующее:

    1. Нажмите ссылку User Authentication Type.

    2. Выберите опцию From the internet. Веб-сайт должен будет теперь обеспечить форму, чтобы позволить пользователю ввести данные для входа в систему. Детали будут сравнены с информацией членства в базе данных MySQL.

  12. Теперь необходимо определить роль и поставщика членства, чтобы использовать. Щелкните по вкладке Provider и сделайте следующее:

    1. Нажмите ссылку Select a different provider for each feature (advanced).

    2. Для поставщика членства выберите MySQLMembershipProvider, для ролевого поставщика выберите MySQLRoleProvider.

  13. В Visual Studio восстановите решение при нажатии Build и Rebuild Solution из главного меню.

  14. Проверьте, что необходимая схема была создана. Это может быть достигнуто, используя SHOW DATABASES; и SHOW TABLES; в интерпретаторе команд mysql.

    mysql> SHOW DATABASES;
    
    +---------------------+
    | Database            |
    +---------------------+
    | information_schema  |
    | mysql               |
    | test                |
    | users               |
    | world               |
    +---------------------+
    5 rows in set (0.01 sec)
    
    mysql> SHOW TABLES;
    
    +---------------------------+
    | Tables_in_users           |
    +---------------------------+
    | my_aspnet_applications    |
    | my_aspnet_membership      |
    | my_aspnet_profiles        |
    | my_aspnet_roles           |
    | my_aspnet_schemaversion   |
    | my_aspnet_users           |
    | my_aspnet_usersinroles    |
    +---------------------------+
    7 rows in set (0.00 sec)
    
  15. Можно теперь создать пользователей и роли для веб-приложения. Самый легкий способ сделать это с ASP.NET Website Administration Tool. Однако много веб-приложений содержат свои собственные модули для создания ролей и пользователей. Для простоты ASP.NET Website Administration Tool будет использоваться в этой обучающей программе.

  16. В ASP.NET Website Administration Tool перейдите на вкладку Security. Теперь, когда членство и ролевой поставщик позволены, вы будете видеть связи для создания ролей и пользователей. Нажмите Create or Manage Roles .

  17. Можно теперь ввести имя новой роли и нажать Add Role, чтобы создать новую роль. Создайте новые роли как требуется.

  18. Нажмите кнопку Back.

  19. Нажмите Create User. Можно теперь заполнить информацию о пользователе, а также ассигновать того пользователя одной или более ролям.

  20. Используя интерпретатор команд mysql, можно проверить, что база данных была правильно наполнена ролевыми данными и членством.

    mysql> SELECT * FROM my_aspnet_users;
    
    mysql>SELECT * FROM my_aspnet_roles;
    

В этой обучающей программе вы видели, как настроить членство в Connector/NET и ролевых поставщиков для использования в вашем веб-приложении ASP.NET.

6.3. Обучающая программа: поставщик профиля Connector/NET ASP.NET

Эта обучающая программа показывает вам, как использовать поставщика профиля MySQL, чтобы хранить информацию профиля пользователя в базе данных MySQL. Обучающая программа использует MySQL Connector/NET 6.9.9, MySQL Server 5.7.21 и Microsoft Visual Studio 2017 Professional Edition.

Много современных веб-сайтов позволяют пользователю создавать личный профиль. Это требует существенного количества кода, но ASP.NET значительно уменьшает это включением функциональности в ее классах профиля. Поставщик профиля обеспечивает абстракцию между этими классами и источником данных. Поставщик профиля MySQL позволяет данным о профиле быть сохраненными в базе данных MySQL. Это позволяет свойствам профиля быть написанными в некое хранилище и восстановленными при необходимости. Поставщик профиля также позволяет данным о профиле управляться эффективно, например они позволяют удалить профили, к которым не получили доступ начиная с определенной даты.

Следующие шаги показывают вам, как можно выбрать поставщика профиля MySQL:

  1. Создайте новый веб-проект ASP.NET.

  2. Выберите инструмент MySQL Application Configuration tool.

  3. В MySQL Application Configuration перейдите на страницу Profiles (см. Profiles Provider).

  4. Отметьте Use MySQL to manage my profiles .

  5. Отметьте Autogenerate Schema.

  6. Нажмите Edit и затем сформируйте строку подключения для базы данных, которая будет использоваться, чтобы хранить информацию профиля пользователя.

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

В этом пункте вы теперь готовы начать использовать MySQL Profile Provider. Со следующими шагами можно выполнить предварительный тест на установку.

  1. Откройте файл web.config .

  2. Добавьте простой профиль, такой как следующий пример.

    <system.web>
      <anonymousIdentification enabled="true"/>
      <profile defaultProvider="MySQLProfileProvider">
      ...
      <properties>
        <add name="Name" allowAnonymous="true"/>
        <add name="Age" allowAnonymous="true" type="System.UInt16"/>
        <group name="UI">
          <add name="Color" allowAnonymous="true" defaultValue="Blue"/>
          <add name="Style" allowAnonymous="true" defaultValue="Plain"/>
        </group>
      </properties>
    </profile>
    ...
    

    Установка anonymousIdentification = true позволяет незаверенным пользователям использовать профили. Они определяются GUID в cookie, а не именем пользователя.

Теперь, когда простой профиль был определен в web.config, следующий шаг должен написать некоторый код, чтобы проверить профиль.

  1. В Design View спроектируйте простую страницу с добавленными средствами управления. Следующие данные показывают вкладку Default.aspx, открытую с текстовым окном, списком и кнопками управления.

    Рис. 6.2. Простое применение профиля

    Content is described in the surrounding text.

    Они позволят пользователю входить в некоторую информацию о профиле. Пользователь может также использовать кнопки, чтобы сохранить их профиль, очистить страницу и восстановить их данные о профиле.

  2. В Code View добавляют следующий фрагмент кода.

    ...
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!IsPostBack)
      {
         TextBox1.Text = Profile.Name;
         TextBox2.Text = Profile.Age.ToString();
         Label1.Text = Profile.UI.Color;
      }
    }
    
    // Store Profile
    protected void Button1_Click(object sender, EventArgs e)
    {
      Profile.Name = TextBox1.Text;
      Profile.Age = UInt16.Parse(TextBox2.Text);
    }
    
    // Clear Form
    protected void Button2_Click(object sender, EventArgs e)
    {
      TextBox1.Text = "";
      TextBox2.Text = "";
      Label1.Text = "";
    }
    
    // Retrieve Profile
    protected void Button3_Click(object sender, EventArgs e)
    {
      TextBox1.Text = Profile.Name;
      TextBox2.Text = Profile.Age.ToString();
      Label1.Text = Profile.UI.Color;
    }
    
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
      Profile.UI.Color = DropDownList1.SelectedValue;
    }
    ...
    
  3. Сохраните все файлы и постройте решение, чтобы проверить, что никакие ошибки не были допущены.

  4. Запустите приложение.

  5. Введите свое имя, возраст и выберите цвет из списка. Теперь сохраните эту информацию в своем профиле при нажатии Store Profile.

    Отбор цвета из списка использует цвет по умолчанию, Blue, который был определен в файле web.config.

  6. Нажмите Clear Form, чтобы очистить текст в текстовых окнах и этикетке, которая показывает ваш выбранный цвет.

  7. Нажмите Retrieve Profile, чтобы восстановить ваши данные профиля из базы данных MySQL.

  8. Теперь выйдите из браузера, чтобы закончить приложение.

  9. Запустите приложение снова, которое также восстанавливает вашу информацию профиля из базы данных MySQL.

В этой обучающей программе вы видели как использовать поставщика профиля MySQL с Connector/NET.

6.4. Обучающая программа: веб-поставщик персонализации

MySQL Connector/NET предоставляет веб-поставщик персонализации, который позволяет вам использовать сервер MySQL, чтобы хранить данные о персонализации.

Эта опция была добавлена в Connector/NET 6.9.0.

Эта обучающая программа демонстрирует, как формировать веб-поставщика персонализации, использующего Connector/NET.

Минимальные требования

  • Веб-сайт ASP.NET или веб-приложение с поставщиком членства.

  • .NET Framework 3.0.

  • MySQL 5.5.

Формирование веб-поставщика персонализации MySQL

Чтобы сформировать поставщика, сделайте следующее:

  1. Добавьте ссылки на MySql.Data и MySql.Web к веб-сайту или проекту веб-приложения.

  2. Включите поставщика персонализации Connector/NET в секцию system.web файла web.config.

    <webParts>
      <personalization defaultProvider="MySQLPersonalizationProvider">
        <providers>
          <clear/>
          <add name="MySQLPersonalizationProvider"
            type="MySql.Web.Personalization.MySqlPersonalizationProvider,
            MySql.Web, Version=6.9.3.0, Culture=neutral,
            PublicKeyToken=c5687fc88969c44d"
            connectionStringName="LocalMySqlServer" applicationName="/" />
        </providers>
        <authorization>
          <allow verbs="modifyState" users="*" />
          <allow verbs="enterSharedScope" users="*"/>
        </authorization>
      </personalization>
    </webParts>
    

Создание веб-средств управления

Чтобы создать веб-средства управления, выполните эти шаги:

  1. Создайте веб-приложение, используя Connector/NET ASP.NET Membership. Для получения информации о выполнении этого посмотрите раздел 6.2.

  2. Создайте новую страницу ASP.NET и затем измените на Design view.

  3. Из Toolbox перетащите WebPartManager на страницу.

  4. Определите HTML-таблицу с тремя колонками и одной строкой.

  5. Из WebParts Toolbox перетащите WebPartZone в первую и во вторую колонки.

  6. Из WebParts Toolbox перетащите CatalogZone с PageCatalogPart и EditorZone в третью колонку.

  7. Добавьте средства управления к WebPartZone, который должен выглядеть подобным следующему примеру:

    <table><tr><td>
    <asp:WebPartZone ID="LeftZone" runat="server" HeaderText="Left Zone">
    <ZoneTemplate>
    <asp:Label ID="Label1" runat="server" title="Left Zone">
    <asp:BulletedList ID="BulletedList1" runat="server">
    <asp:ListItem Text="Item 1"></asp:ListItem>
    <asp:ListItem Text="Item 2"></asp:ListItem>
    <asp:ListItem Text="Item 3"></asp:ListItem>
    </asp:BulletedList>
    </asp:Label>
    </ZoneTemplate>
    </asp:WebPartZone></td>
    <td>
    <asp:WebPartZone ID="MainZone" runat="server" HeaderText="Main Zone">
    <ZoneTemplate>
    <asp:Label ID="Label11" runat="server" title="Main Zone">
    <h2>This is the Main Zone</h2>
    </asp:Label>
    </ZoneTemplate>
    </asp:WebPartZone></td>
    <td><asp:CatalogZone ID="CatalogZone1" runat="server">
    <ZoneTemplate>
    <asp:PageCatalogPart ID="PageCatalogPart1" runat="server" />
    </ZoneTemplate>
    </asp:CatalogZone>
    <asp:EditorZone ID="EditorZone1" runat="server">
    <ZoneTemplate>
    <asp:LayoutEditorPart ID="LayoutEditorPart1" runat="server" />
    <asp:AppearanceEditorPart ID="AppearanceEditorPart1" runat="server" />
    </ZoneTemplate>
    </asp:EditorZone>
    </td></tr></table>
    
  8. За пределами HTML-таблицы добавьте выпадающий список, две кнопки и этикетку следующим образом:

    <asp:DropDownList ID="DisplayModes" runat="server" AutoPostBack="True"
      OnSelectedIndexChanged="DisplayModes_SelectedIndexChanged">
    </asp:DropDownList>
    <asp:Button ID="ResetButton" runat="server" Text="Reset"
      OnClick="ResetButton_Click" />
    <asp:Button ID="ToggleButton" runat="server" OnClick="ToggleButton_Click"
      Text="Toggle Scope" />
    <asp:Label ID="ScopeLabel" runat="server"></asp:Label>
    
  9. Следующий код заполняет список для режимов отображения, показывает текущий объем, перезагружает состояние персонализации, переключает тип объема (между пользователем и общим объемом) и изменяет режим отображения.

    public partial class WebPart : System.Web.UI.Page
    {
      protected void Page_Load(object sender, EventArgs e)
      {
        if (!IsPostBack)
        {
           foreach (WebPartDisplayMode mode in WebPartManager1.SupportedDisplayModes)
           {
             if (mode.IsEnabled(WebPartManager1))
             {
                DisplayModes.Items.Add(mode.Name);
             }
           }
        }
        ScopeLabel.Text = WebPartManager1.Personalization.Scope.ToString();
      }
    
      protected void ResetButton_Click(object sender, EventArgs e)
      {
        if (WebPartManager1.Personalization.IsEnabled &&
            WebPartManager1.Personalization.IsModifiable)
        {
           WebPartManager1.Personalization.ResetPersonalizationState();
        }
      }
    
      protected void ToggleButton_Click(object sender, EventArgs e)
      {
        WebPartManager1.Personalization.ToggleScope();
      }
    
      protected void DisplayModes_SelectedIndexChanged(object sender, EventArgs e)
      {
        var mode = WebPartManager1.SupportedDisplayModes[DisplayModes.SelectedValue];
        if (mode != null && mode.IsEnabled(WebPartManager1))
        {
           WebPartManager1.DisplayMode = mode;
        }
      }
    }
    

Тестирование веб-изменений

Используйте следующие шаги, чтобы проверить ваши изменения:

  1. Запустите приложение и откройте веб-страницу. Страница должна быть похожей на пример, показанный на следующем рисунке, на котором кнопка Toggle Scope установлена в Shared. Страница также включает выпадающий список, кнопку Reset и средства управления Left Zone и Main Zone.

    Рис. 6.3. Веб-страница

    Content is described in the surrounding text.

    Первоначально, когда учетная запись пользователя не авторизована, объем scope is Shared по умолчанию. Учетная запись пользователя должна быть авторизована, чтобы изменить настройки на средствах управления. Следующие данные показывают пример, в котором пользователь в состоянии настроить средства управления при помощи выпадающего списка Browse. Варианты в списке: Design, Catalog и Edit.

    Рис. 6.4. Средства управления

    Content is described in the surrounding text.
  2. Нажмите Toggle Scope, чтобы переключить приложение назад к общему объему.

  3. Теперь можно персонализировать зоны, используя режимы отображения Edit или Catalog в определенном пользователе или общем уровне. Дальше показан Catalog выбранный из выпадающего списка, который включает элемент Catalog Zone, который был добавлен ранее.

    Рис. 6.5. Personalize Zones

    Content is described in the surrounding text.

6.5. Обучающая программа: простой веб-поставщик членства

Эта секция документирует способность использовать простого поставщика членства на шаблоне MVC 4. Конфигурация OAuth совместима с приложением для входа, используя внешнюю авторизацию от таких сторонних поставщиков, как Google, Facebook, Твиттер или других.

Эта обучающая программа создает приложение, используя простого поставщика членства и затем добавляет поддержку аутентификации через третье лицо (Google) OAuth.

яЭта опция была добавлена в MySQL Connector/NET 6.9.0.

Требования

  • Connector/NET 6.9.x или выше.

  • .NET Framework 4.0 или выше.

  • Visual Studio 2012 или выше.

  • MVC 4.

Создание и формирование нового проекта

Чтобы начать новый проект, сделайте следующее:

  1. Откройте Visual Studio, создайте новый проект типа веб-приложения ASP.NET MVC 4 Web Application и сформируйте проект, чтобы использовать .NET Framework 4.5.

    Рис. 6.6. Simple Membership: новый проект

    Content is described in the surrounding text.
  2. Выберите шаблон и движок просмотра. Эта обучающая программа использует Internet Application Template с движком Razor. Произвольно, можно добавить единицу тестового проекта выбором Create a unit test project.

    Рис. 6.7. Simple Membership: выбор шаблона и движка

    Content is described in the surrounding text.
  3. Добавьте ссылки на сборки MySql.Data, MySql.Data.Entities и MySql.Web. Выбранные сборки должны соответствовать версиям .NET Framework и Entity Framework, добавленным к проекту шаблоном.

  4. Добавьте действительную последовательность подключения MySQL в файл web.config, подобно следующему примеру.

    <add name="MyConnection" connectionString="server=localhost;
      UserId=root; password=pass; database=MySqlSimpleMembership;
      logging=true;port=3305" providerName="MySql.Data.MySqlClient"/>
    
  5. Под узлом <system.data> добавьте конфигурационную информацию, подобно следующему примеру.

    <membership defaultProvider="MySqlSimpleMembershipProvider">
      <providers>
        <clear/>
        <add name="MySqlSimpleMembershipProvider"
          type="MySql.Web.Security.MySqlSimpleMembershipProvider,MySql.Web,
          Version=6.9.2.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
          applicationName="MySqlSimpleMembershipTest"
          description="MySQLdefaultapplication"
          connectionStringName="MyConnection" userTableName="MyUserTable"
          userIdColumn="MyUserIdColumn" userNameColumn="MyUserNameColumn"
          autoGenerateTables="True"/>
      </providers>
    </membership>
    
  6. Обновите конфигурацию с действительными значениями для следующих свойств: connectionStringName, userTableName, userIdColumn, userNameColumn и autoGenerateTables.

    • userTableName: Название таблицы, чтобы хранить пользовательскую информацию. Эта таблица независима от схемы, произведенной поставщиком, и это может быть изменено в будущем.

    • userId: Название колонки, которая хранит ID для записей в userTableName.

    • userName: Название колонки, которая хранит имя пользователя для записей в userTableName.

    • connectionStringName: Это значение должно соответствовать строке подключения, определенной в файле web.config.

    • autoGenerateTables: Должно быть false, если таблица уже существует.

  7. Обновите ваш класс DBContext с формируемым именем строки подключения.

  8. Откройте файл InitializeSimpleMembershipAttribute.cs из каталога Filters/ и найдите класс SimpleMembershipInitializer. Найдите вызов метода WebSecurity.InitializeDatabaseConnection и обновите параметры с конфигурацией для connectionStringName, userTableName, userIdColumn и userNameColumn.

  9. Если база данных в строке подключения не существует, то создайте ее.

  10. После запуска веб-приложением произведенная домашняя страница показана на рисунке.

    Рис. 6.8. Simple Membership: произведенная домашняя страница

    Content is described in the surrounding text.
  11. Если приложение выполнилось нормально, то произведенная схема будет подобна следующему рисунку, показывающему обозреватель объектов, открытый для таблиц.

    Рис. 6.9. Simple Membership: произведенная схема и таблицы

    Content is described in the surrounding text.
  12. Чтобы создать пользовательский логин, нажмите Register на произведенной веб-странице. Напечатайте имя пользователя и пароль, затем выполните регистрацию. Это действие перенаправляет к домашней странице с недавно созданным пользователем.

    Данные для недавно созданного пользователя могут быть расположены в таблицах UserProfile и Webpages_Membership.

Добавление идентификации OAuth к проекту

OAuth это другой вариант аутентификации для веб-сайтов, которые используют простого поставщика членства. Пользователь может быть проверен, используя внешнюю учетку, например, для Facebook, Twitter, Google и другие.

Используйте следующие шаги, чтобы позволить идентификацию, используя учетку Google в приложении:

  1. Найдите файл AuthConfig.cs в каталоге App_Start.

  2. Поскольку эта обучающая программа использует Google, найдите метод RegisterAuth и раскомментируйте последнюю строку, где это вызывает OauthWebSecurity.RegisterGoogleClient.

  3. Запустите приложение. Когда оно работает, нажмите Log in, чтобы открыть регистрацию на странице. Затем нажмите Google под Use another service to log in.

    Рис. 6.10. Simple Membership с OAuth: Google Service

    Content is described in the surrounding text.
  4. Это действие перенаправляет к странице входа в систему Google (на google.com) и запросит сведения о вашей учетной записи Google.

  5. После предоставления правильных данных сообщение просит разрешение для вашего запроса получить доступ к информации пользователя. Прочитайте описание и затем нажмите Accept, чтобы позволить указанные действия и перенаправить назад к странице входа в систему.

  6. Приложение теперь может зарегистрировать учетку. Поле User name будет заполнено соответствующей информацией (в этом случае адрес электронной почты, который связан с учеткой Google). Нажмите Register, чтобы зарегистрировать пользователя в вашем приложении.

    Теперь новый пользователь зарегистрирован от внешнего источника, используя OAuth. Информация о новом пользователе хранится в таблицах UserProfile и Webpages_OauthMembership.

Чтобы использовать другой внешний выбор для аутентификации пользователя, необходимо включить клиент в том же самом классе, где мы включили Google в этой обучающей программе. Как правило, поставщики требуют, чтобы вы зарегистрировали свое приложение прежде, чем позволить идентификацию OAuth, и после регистрации они, как правило, обеспечивают символ/ключ и ID, который должен использоваться, регистрируя поставщика в приложении.

6.6. Обучающая программа: применение Entity Framework как источник данных Windows Forms

Эта обучающая программа описывает, как создать источник данных Windows Forms из Entity в Entity Data Model через Microsoft Visual Studio.

Чтобы выполнить шаги в этой обучающей программе, сначала установите образец базы данных world, который можно загрузить с MySQL Documentation page. Можно также найти детали о том, как установить базу данных на той же самой странице.

Создание нового приложения Windows Forms

Первый шаг должен создать новое приложение Windows Forms.

  1. В Visual Studio выберите File, New и Project из главного меню.

  2. Выберите установленный шаблон Windows Forms Application, нажмите OK. Решение создается.

Чтобы приобрести последнюю сборку Entity Framework для MySQL, загрузите пакет NuGet. Альтернативно, используйте инструмент MySQL Application Configuration в MySQL for Visual Studio 1.2.9 (или выше), чтобы приобрести последний пакет и скоординировать конфигурацию. Для получения дополнительной информации об использовании инструмента, посмотрите Entity Framework.

Добавление модели данных

Чтобы добавить Entity Data Model к вашему решению, сделайте следующее:

  1. В Solution Explorer щелкните правой кнопкой мыши по своему приложению и выберите Add и New Item. В Visual Studio installed templates выберите ADO.NET Entity Data Model. Нажмите Add.

    Рис. 6.11. Добавляем Entity Data Model

    Content is described in the surrounding text.
  2. Вы будете теперь видеть мастера Entity Data Model. Вы будете использовать мастера, чтобы произвести Entity Data Model из образца базы данных. world. Выберите символ EF Designer from database (или Generate from database в более старых версиях Visual Studio). Нажмите Next.

  3. Можно теперь выбрать соединение localhost(world), которое вы сделали ранее к базе данных. Выберите следующие пункты:

    • Да, включать уязвимые данные в строку подключения.

    • Сохраните настройки подключения entity в App.config:

      worldEntities

    Если вы еще не сделали так, можно создать новую связь в это время при нажатии New Connection. Для дополнительных инструкций относительно создания связи с базой данных посмотрите Making a Connection.

    Рис. 6.12. Мастер Entity Data Model: соединение

    Content is described in the surrounding text.

    Обратите внимание на настройки подключения, которые будут использоваться в App.Config, поскольку они будут использоваться позже, чтобы написать необходимый управляющий код. Нажмите Next.

  4. Мастер Entity Data Model Wizard соединяется с базой данных.

    Как следующие данные показывают, вы получаете древовидную структуру базы данных. Отсюда можно выбрать объект, который требуется включить в модель. Если вы также создали обзоры и сохраненные подпрограммы, эти пункты будут показаны наряду с любыми таблицами. В этом примере просто необходимо выбрать таблицы. Нажмите Finish, чтобы создать модель и выйти из мастера.

    Рис. 6.13. Мастер Entity Data Model: объекты и настройки

    Content is described in the surrounding text.

    Visual Studio производит модель с тремя таблицами (city, country и countrylanguage), затем их показывает.

    Рис. 6.14. Диаграмма Entity Data Model

    Content is described in the surrounding text.
  5. Из главного меню Visual Studio выберите Build и Build Solution, чтобы гарантировать, что все собирается правильно.

Добавление нового источника данных

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

  1. Из главного меню Visual Studio выберите Data и Add New Data Source. Откроется мастер Data Source Configuration Wizard.

  2. Выберите Object и нажмите Next.

  3. Выберите объект. Раскройте дерево, как показано ниже.

    В этой обучающей программе вы выберете таблицу city. После того, как таблица была отобрана, нажмите Next.

    Рис. 6.15. Мастер Data Source Configuration

    Content is described in the surrounding text.
  4. Мастер подтвердит, что объект добавлен. Нажмите Finish.

  5. Объект city теперь появится в группе источников данных. Если группа источников данных не показана, выберите Data и Show Data Sources из главного меню Visual Studio. Состыкованная панель тогда будет показана.

Используя источник данных в Windows Form

Этот шаг описывает, как использовать источник данных в Windows Form.

  1. В панели Data Sources выбираете источник данных, который вы создали и просто перетаскиваете его в Form Designer. По умолчанию объект источника данных будет добавлен как Data Grid View.

    Data Grid View связан с cityBindingSource, Navigator связан с cityBindingNavigator.

    Рис. 6.16. Data Form Designer

    Content is described in the surrounding text.
  2. Сохраните и восстановите решение перед продолжением.

Добавление кода, чтобы наполнить Data Grid View

Вы теперь готовы добавить код, чтобы гарантировать, что Data Grid View будет наполнен данными из таблицы city базы данных.

  1. Дважды щелкните по форме, чтобы получить доступ к ее коду.

  2. Добавьте следующий код, чтобы создать экземпляр объекта Entity Data Model EntityContainer и получить данные из базы данных, чтобы его наполнить.

    using System.Windows.Forms;
    namespace WindowsFormsApplication4
    {
      public partial class Form1 : Form
      {
        worldEntities we;
    
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          we = new worldEntities();
          cityBindingSource.DataSource = we.city.ToList();
        }
      }
    }
    
  3. Сохраните и восстановите решение.

  4. Запустите решение. Подтвердите, что сетка наполнена (см. следующий рисунок для примера), и что можно работать с базой данных.

    Рис. 6.17. Наполненный Grid Control

    Content is described in the surrounding text.

Добавление кода, чтобы сохранить изменения базы данных

Обязательный исходный компонент Binding гарантирует, что изменения, сделанные в Data Grid View, также внесены в классы Entity, связанные с ним. Однако, те данные должны быть сохранены назад из entities в базу данных. Это может быть достигнуто предоставлением возможности кнопки Save в навигаторе и добавлением некоторого кода.

  1. В Form Designer щелкните по символу сохранения на панели инструментов формы и подтвердите, что ее свойство Enabled=True .

  2. Дважды щелкните по символу сохранения на панели инструментов формы, чтобы показать код.

  3. Добавьте следующий (или подобный) код, чтобы гарантировать, что данные сохраняются в базе данных, когда пользователь нажимает кнопку в приложении.

    public Form1()
    {
      InitializeComponent();
    }
    
    private void Form1_Load(object sender, EventArgs e)
    {
      we = new worldEntities();
      cityBindingSource.DataSource = we.city.ToList();
    }
    
    private void cityBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
      we.SaveChanges();
    }
    
  4. Когда код был добавлен, сохраните решение и затем соберите его. Запустите приложение и проверьте, что изменения, внесенные в сетке, сохранены.

6.7. Обучающая программа: привязка данных в ASP.NET, используя LINQ на Entities

В этой обучающей программе вы создаете веб-страницу ASP.NET, которая связывает запросы LINQ с Entity Framework, используя отображение с MySQL Connector/NET.

Если вы еще не сделали этого, установите образец базы данных world до попытки работы с этой обучающей программой. Посмотрите, например, раздел 6.6 для получения инструкций относительно загрузки и установки этой базы данных.

Создание веб-сайта ASP.NET

В этой части обучающей программы вы создаете веб-сайт ASP.NET. Веб-сайт использует базу данных world. Главная веб-страница показывает выпадающий список, из которого можно выбрать страну. Данные о городах той страны тогда будут показаны в GridView.

  1. В главном меню Visual Studio выберите File, New и Web Site.

  2. Из установленных шаблонов Visual Studio выберите ASP.NET Web Site. Нажмите OK. Вы получите представление Source вашей веб-страницы по умолчанию.

  3. Щелкните по вкладке Design, расположенной под группой представления Source.

  4. В панели Design введите некоторый текст, чтобы украсить чистую веб-страницу.

  5. Нажмите Toolbox. Из списка средств управления выберите DropDownList. Перетащите его ниже текста на вашей веб-странице.

  6. Из контекстного меню DropDownList гарантируйте, что флажок Enable AutoPostBack включен. Это гарантирует, что обработчик событий контроля вызывают, когда пункт выбран. Выбор пользователя будет в свою очередь использоваться, чтобы наполнить GridView.

  7. Из Toolbox выберите GridView. Перетащите GridView чуть ниже выпадающего списка, который вы уже поместили.

    Следующие данные показывают пример декоративного текста и двух средств управления на вкладке Design. Добавленный GridView произвел сетку с тремя колонками (Column0, Column1 и Column3) и последовательность abc в каждой клетке сетки.

    Рис. 6.18. Установленный GridView

    Content is described in the surrounding text.
  8. Рекомендуется, чтобы вы сохранили и построили решение, чтобы гарантировать, что нет никаких ошибок.

  9. Если вы будете управлять решением, то будете видеть, что текст и выпадающий список показаны, но список пуст. Кроме того, представление сетки не появляется вообще. Добавление этой функциональности описано в следующих разделах.

На данном этапе у вас есть веб-сайт, который построен, но дальнейшая функциональность пока еще требуется. Следующий шаг должен будет использовать Entity Framework, чтобы создать отображение из базы данных world в entities, которыми можно управлять программно.

Создание ADO.NET Entity Data Model

На этой стадии обучающей программы вы добавите ADO.NET Entity Data Model к своему проекту, используя базу данных world на уровне хранения. Процедура, чтобы сделать это, описана в разделе 6.6.

Наполнение поля списка при помощи результатов запроса Entity LINQ

В этой части обучающей программы вы напишете код, чтобы наполнить DropDownList. Загрузка веб-страницей данных, чтобы наполнить список, будет достигнуто при помощи результатов запроса LINQ на модели, созданной ранее.

  1. В группе Design дважды щелкните по любой чистой области. Это откроет метод Page_Load.

  2. Измените соответствующий раздел кода согласно следующему примеру листинга.

    ...
    public partial class _Default : System.Web.UI.Page
    {
      worldModel.worldEntities we;
    
      protected void Page_Load(object sender, EventArgs e)
      {
        we = new worldModel.worldEntities();
        if (!IsPostBack)
        {
           var countryQuery = from c in we.country
           orderby c.Name
           select new { c.Code, c.Name };
           DropDownList1.DataValueField = "Code";
           DropDownList1.DataTextField = "Name";
           DropDownList1.DataSource = countryQuery.ToList();
           DataBind();
        }
      }
    ...
    

    Список должен быть наполнен только когда страница загружается. Условный код гарантирует, что, если страница впоследствии перезагружается, список не наполнен повторно, что потеряло бы пользовательский выбор.

  3. Сохраните решение, постройте его и запустите. Необходимо видеть, что список был наполнен. Можно выбрать пункт, но пока еще GridView не появляется.

В этом пункте вы имеете рабочий Drop Down List, наполненный запросом LINQ на вашей модели данных.

Наполнение Grid View при помощи запроса Entity LINQ

В последней части этой обучающей программы вы наполните Grid View, используя запрос LINQ на вашей модели данных.

  1. В представлении Design дважды щелкните по DropDownList. Это действие вызывает код SelectedIndexChanged. Этот метод вызывают, когда пользователь выбирает пункт в списке и таким образом производит событие AutoPostBack.

  2. Измените соответствующий раздел кода соответственно следующему примеру листинга.

    ...
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
      var cityQuery = from c in we.city
      where c.CountryCode == DropDownList1.SelectedValue
      orderby c.Name
      select new { c.Name, c.Population, c.CountryCode };
      GridView1.DataSource = cityQuery;
      DataBind();
    }
    ...
    

    Контроль за представлением сетки наполнен от результата запроса LINQ на модели данных.

  3. Сохраните, соберите и запустите приложение. Когда вы выбираете страну, вы будете видеть, что ее города показаны в GridView. Следующие данные показывают Бельгию, выбранную из поля списка и таблицу с тремя колонками: Name, Population и CountryCode.

    Рис. 6.19. Рабочий веб-сайт

    Content is described in the surrounding text.

В этой обучающей программе вы видели, как создать веб-сайт ASP.NET, вы также видели, как можно получить доступ к базе данных MySQL, используя запросы LINQ на модели данных.

6.8. Обучающая программа: создание MySQL DDL из модели Entity Framework

Эта обучающая программа демонстрирует, как создать MySQL DDL из модели Entity Framework. Минимально вам будет нужен Microsoft Visual Studio 2017 и MySQL Connector/NET 6.10.

  1. Создайте новое консольное приложение в Visual Studio 2017.

  2. Используя Solution Explorer, добавьте ссылку на MySql.Data.Entity.

  3. Из Solution Explorer выберите Add, New Item. В диалоге Add New Item выберите Online Templates. Выберите ADO.NET Entity Data Model и нажмите Add, чтобы открыть диалог Entity Data Model.

  4. В диалоге Entity Data Model выберите Empty Model. Нажмите Finish, чтобы создать пустую модель.

  5. Создайте простую модель. Единственный Entity сделан в целях этой обучающей программы.

  6. На панели Properties выберите ConceptualEntityModel из списка.

  7. На панели Properties выберите DDL Generation Template в категории Database Script Generation.

  8. Для свойства DDL Generation выберите SSDLToMySQL.tt(VS) из списка.

  9. Сохраните решение.

  10. Щелкните правой кнопкой мыши по пустому месту в области проектирования, чтобы открыть контекстне меню. Из меню выберите Generate Database from Model, чтобы открыть диалог Generate Database Wizard.

  11. В диалоге Generate Database Wizard выбирают существующую связь или создают новую связь с сервером. Выберите подходящий вариант, чтобы показать или скрыть уязвимые данные. В целях этой обучающей программы можно выбрать Yes, хотя вы могли бы пропустить это для коммерческого применения.

  12. Нажмите Next, чтобы произвести MySQL-совместимый DDL-код и затем Finish, чтобы выйти из мастера.

Вы видели, как создать код MySQL DDL из модели Entity Framework.

6.9. Обучающая программа: основные операции CRUD с Connector/NET

Эта обучающая программа обеспечивает инструкции о том, как начать использовать MySQL в качестве хранилища документов с MySQL Connector/NET. Для понятий и дополнительных примеров использования см. X DevAPI User Guide.

Минимальные требования

  • MySQL Server 8.0.11 с X Protocol.

  • Connector/NET 8.0.11.

  • Visual Studio 2013/2015/2017.

  • Образец базы данных world_x.

Импортируйте образец документа

Скрипту MySQL предоставляют данные и коллекцию JSON. Образец содержит следующее:

  • Коллекция.

    • countryinfo: информация о странах в мире.

  • Таблицы.

    • country: минимальная информация о странах мира.

    • city: информация о некоторых городах в тех странах.

    • countrylanguage: на каких языках говорят в каждой стране.

Чтобы установить образец базы данных world_x:

  1. Скачайте world_x.zip с http://dev.mysql.com/doc/index-other.html.

  2. Извлеките инсталляционный архив в какое-то место, например, в /tmp/.

    Распаковывание архива приводит к двум файлам, один из них world_x.sql.

  3. Соединитесь с сервером MySQL, используя MySQL Client:

    shell> mysql -u root -p
    

    Введите свой пароль. Не-root может использоваться, пока есть привилегии создать новые базы данных. Для получения дополнительной информации об использовании MySQL Client см. mysql The MySQL Command-Line Client.

  4. Выполните скрипт world_x.sql, чтобы создать структуру базы данных и вставить данные следующим образом:

    mysql> SOURCE /temp/world_x.sql;
    

    Замените /temp/ на путь к файлу world_x.sql в вашей системе.

Добавьте ссылки на необходимые DLL

Создайте новый консольный проект в Visual Studio, предназначающийся для .NET Framework 4.5.2 (или выше), .NET Core 1.1 или .NET Core 2.0. Примеры кода в этой обучающей программе показываются на языке C#, но можно использовать любой .NET-язык.

Добавьте ссылку в своем проекте к следующим DLL:

  • MySql.Data.dll

  • Google.Protobuf.dll

Пространства имен для импорта

Импортируйте необходимые пространства имен, добавив следующие запросы:

using MySqlX.XDevAPI;
using MySqlX.XDevAPI.Common;
using MySqlX.XDevAPI.CRUD;

Создайте сессию

Сессия в X DevAPI это понятие сессии базы данных высокого уровня, которое отличается от работы с традиционными подключениями mysql низкого уровня. Важно понять, что эта сессия не то же самое, что традиционная сессия MySQL. Сессии заключают в капсулу одно или несколько фактических подключений mysql.

Следующий пример открывает сессию, которую можно использовать позже, чтобы восстановить схему и выполнить основные операции CRUD.

string schemaName = "world_x";
// Define the connection string
string connectionURI = "mysqlx://test:test@localhost:33060";
Session session = MySQLX.GetSession(connectionURI);
// Get the schema object
Schema schema = session.GetSchema(schemaName);

Найдите строку в коллекции

После того, как сессия создана, можно выполнить операцию поиска. Следующий пример использует объект сессии, который вы создали:

// Use the collection 'countryinfo'
var myCollection = schema.GetCollection("countryinfo");
var docParams = new DbDoc(new { name1 = "Albania", _id1 = "ALB" });

// Find a document
DocResult foundDocs = myCollection.Find("Name = :name1 || _id = :_id1").Bind(docParams).Execute();
while (foundDocs.Next())
{
  Console.WriteLine(foundDocs.Current["Name"]);
  Console.WriteLine(foundDocs.Current["_id"]);
}

Вставьте новый документ в коллекцию

// Insert a new document with an identifier
var obj = new { _id = "UKN", Name = "Unknown" };
Result r = myCollection.Add(obj).Execute();

Обновите существующий документ

// using the same docParams object previously created
docParams = new DbDoc(new { name1 = "Unknown", _id1 = "UKN" });
r = myCollection.Modify("_id = :Id").Bind("id", "UKN").Set("GNP", "3308").Execute();
if (r.AffectedItemsCount == 1)
{
   foundDocs = myCollection.Find("Name = :name1|| _id = :_id1").Bind(docParams).Execute();
   while (foundDocs.Next())
   {
     Console.WriteLine(foundDocs.Current["Name"]);
     Console.WriteLine(foundDocs.Current["_id"]);
     Console.WriteLine(foundDocs.Current["GNP"]);
   }
}

Удалите определенный документ

r = myCollection.Remove("_id = :id").Bind("id", "UKN").Execute();

Закройте сессию

session.Close();

Полный пример кода

Следующий пример показывает основные операции с коллекцией.

using MySqlX.XDevAPI;
using MySqlX.XDevAPI.Common;
using MySqlX.XDevAPI.CRUD;
using System;

namespace MySQLX_Tutorial
{
  class Program
  {
    static void Main(string[] args)
    {
      string schemaName = "world_x";
      string connectionURI = "mysqlx://test:test@localhost:33060";
      Session session = MySQLX.GetSession(connectionURI);
      Schema schema = session.GetSchema(schemaName);
      // Use the collection 'countryinfo'
      var myCollection = schema.GetCollection("countryinfo");
      var docParams = new DbDoc(new { name1 = "Albania", _id1 = "ALB" });
      // Find a document
      DocResult foundDocs = myCollection.Find("Name = :name1 || _id = :_id1").Bind(docParams).Execute();
      while (foundDocs.Next())
      {
        Console.WriteLine(foundDocs.Current["Name"]);
        Console.WriteLine(foundDocs.Current["_id"]);
      }
      // Insert a new document with an id
      var obj = new { _id = "UKN", Name = "Unknown" };
      Result r = myCollection.Add(obj).Execute();
      // update an existing document
      docParams = new DbDoc(new { name1 = "Unknown", _id1 = "UKN" });
      r = myCollection.Modify("_id = :Id").Bind("id", "UKN").Set("GNP", "3308").Execute();
      if (r.AffectedItemsCount == 1)
      {
         foundDocs = myCollection.Find("Name = :name1|| _id = :_id1").Bind(docParams).Execute();
         while (foundDocs.Next())
         {
           Console.WriteLine(foundDocs.Current["Name"]);
           Console.WriteLine(foundDocs.Current["_id"]);
           Console.WriteLine(foundDocs.Current["GNP"]);
         }
      }
      // delete a row in a document
      r = myCollection.Remove("_id = :id").Bind("id", "UKN").Execute();
      // close the session
      session.Close();
      Console.ReadKey();
    }
  }
}

6.10. Обучающая программа: формирование SSL с Connector/NET

В этой обучающей программе вы изучите, как можно использовать MySQL Connector/NET, чтобы соединиться с сервером MySQL, чтобы использовать SSL. Поддержка клиентом SSL-сертификата PFX была добавлена в Connector/NET 6.2. PFX это собственный формат сертификатов в Microsoft Windows. Позже поддержка клиентом SSL-сертификата PEM была добавлена в Connector/NET 8.0.16.

MySQL Server использует формат PEM для сертификатов и закрытых ключей. Connector/NET позволяет использование сертификатов PEM или PFX с классическим протоколом MySQL и с X-протоколом. Эта обучающая программа использует тестовый сертификат от набора тестов сервера, как пример. Можно получить исходный код MySQL Server с MySQL Downloads. Сертификаты могут быть найдены в каталоге ./mysql-test/std_data.

Чтобы применять конфигурацию запуска серверной стороны для связей SSL:

  1. В конфигурационном файле MySQL Server установите параметры SSL как показано в следующем примере. Приспособьте пути к каталогам согласно местоположению, в котором вы установили исходный код MySQL.

    ssl-ca=path/to/repo/mysql-test/std_data/cacert.pem
    ssl-cert=path/to/repo/mysql-test/std_data/server-cert.pem
    ssl-key=path/to/repo/mysql-test/std_data/server-key.pem
    

    Опция SslCa принимает сертификаты формата PEM и PFX, используя расширение файла, чтобы определить, как обработать сертификат. Измените cacert.pem на cacert.pfx, если вы намереваетесь продолжить с PFX в этой обучающей программе.

    Для описания вариантов строки подключения, используемых в этой обучающей программе, посмотрите раздел 4.5 .

  2. Создайте тестовую учетную запись, чтобы использовать в этой обучающей программе и установите требование SSL. Используя клиент командной строки MySQL, соединитесь как root и создайте пользователя sslclient (с паролем test). Затем предоставьте привилегии новой учетной записи пользователя следующим образом:

    CREATE USER sslclient@'%' IDENTIFIED BY 'test' REQUIRE SSL;
    GRANT ALL PRIVILEGES ON *.* TO sslclient@'%';
    

    Для получения дальнейшей информации о стратегиях учетных записей см. Access Control and Account Management.

Теперь, когда конфигурация серверной стороны закончена, можно начать клиентскую конфигурацию, используя сертификат формата PEM или PFX в Connector/NET.

6.10.1. Сертификаты PEM в Connector/NET

Прямое использование сертификатов формата PEM было введено, чтобы упростить управление сертификатами в многоплатформенной окружающей среде, которая включает подобные продукты MySQL. В предыдущих версиях Connector/NET ваш единственный выбор состоял в том, чтобы использовать зависимые от платформы сертификата форматы PFX.

Для этого примера используйте испытательные сертификаты клиента из хранилища сервера MySQL (server-repository-root /mysql-test/std_data). В вашем приложении добавьте строку подключения, используя базу данных test и пользователя sslclient:

  1. Установите опцию SslMode к необходимому уровню безопасности. Сертификаты PEM требуются только для for VerifyCA и VerifyFull. Все другие значения режима игнорируют сертификат, даже если им его предоставляют.

    using (MySqlConnection connection = new MySqlConnection(
           "database=test;user=sslclient;" + "SslMode=VerifyFull"
    
  2. Добавьте соответствующие сертификаты SSL. Поскольку эта обучающая программа устанавливает опцию SslMode = VerifyFull, необходимо также предоставить значения для опций SslCa, SslCert и SslKey. Каждый выбор должен указать на файл с расширением .pem.

    "SslCa=ca.pem;" + "SslCert=client-cert.pem;" + "SslKey=client-key.pem;"))
    

    Альтернативно, если вы устанавливаете режим SSL в VerifyCA, нужна только опция SslCa.

  3. Откройте связь. Следующий пример открывает связь, используя классический протокол MySQL, но можно выполнить подобный тест, используя X-протокол.

    using (MySqlConnection connection = new MySqlConnection(
           "database=test;user=sslclient;" + "SslMode=VerifyFull" +
           "SslCa=ca.pem;" + "SslCert=client-cert.pem;" +
           "SslKey=client-key.pem;"))
    {
      connection.Open();
    }
    

Ошибки при обработке сертификатов PEM приводят к исключению. Для получения дополнительной информации посмотрите Command Options for Encrypted Connections.

6.10.2. Сертификаты PFX в Connector/NET

.NET не оказывает поддержку формата PEM. Вместо этого Windows включает хранилище сертификата, которое предоставляет зависимые от платформы сертификата в формате PFX. В целях этого примера используйте испытательные сертификата клиента из хранилища сервера MySQL (./mysql-test/std_data). Преобразуйте их сначала к PFX-формату. Этот формат также известен как PKCS#12.

Чтобы закончить шаги в этой обучающей программе для сертификатов PFX, у вас должен быть установлен Open SSL. Это может быть загружено для Microsoft Windows бесплатно с Shining Light Productions.

Создание файла сертификата, чтобы использовать с .NET-клиентом

  1. Из каталога server-repository-root /mysql-test/std_data:

    openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem \
            -certfile cacert.pem -out client.pfx
    
  2. Когда спросят относительно экспортного пароля, введите пароль pass. Файл client.pfx создан. Этот файл используется в обучающей программе.

Соединение с сервером, используя основанные на файле сертификаты

  1. Используйте файл client.pfx, который вы создали на предыдущем шаге, чтобы подтвердить подлинность клиента. Следующий пример демонстрирует, как соединиться с использованием опций SslMode, CertificateFile и CertificatePassword.

    using (MySqlConnection connection = new MySqlConnection(
           "database=test;user=sslclient;" +
           "CertificateFile=H:\\git\\mysql-trunk\\mysql-test\\std_data\\client.pfx;" +
           "CertificatePassword=pass;" + "SslMode=Required "))
    {
      connection.Open();
    }
    

    Путь к файлу сертификата должен быть изменен, чтобы отразить вашу установку. Когда используется PFX-сертификат, опция SslMode проверяет сертификат для всех режимов SSL, кроме None.

Соединение с сервером, используя хранилище сертификатов

  1. Первый шаг должен импортировать файл PFX client.pfx в Personal Store. Дважды щелкните по файлу в Windows Explorer. Это запустит Certificate Import Wizard.

  2. Выполните шаги, продиктованные мастером, и на запрос пароля для файла PFX введите pass.

  3. Нажмите Finish, чтобы закрыть мастер и импортировать сертификат в хранилище.

Исследование сертификатов в хранилище

  1. Запустите Microsoft Management Console, вводом в командную строку mmc.exe.

  2. Выберите Add/Remove snap-in из меню File, нажмите Add. Из списка доступных оснасток выберите Certificates.

  3. В диалоге нажмите Add и выберите опцию My user account. Этот выбор используется для личных сертификатов.

  4. Нажмите Finish.

  5. Нажмите OK, чтобы закрыть диалог Add/Remove Snap-in.

  6. У вас теперь есть Certificates Current User в левой панели Microsoft Management Console. Разверните пункт дерева Certificates - Current User и выберите Personal, Certificates. Правая панель показывает сертификат в MySQL, который был ранее импортирован. Дважды щелкните по сертификату, чтобы показать его детали.

  7. После того, как вы импортировали сертификат в Personal Store, можно использовать более сжатую строку подключения, чтобы соединиться с базой данных, как иллюстрировано следующим кодом:

    using (MySqlConnection connection = new MySqlConnection(
           "database=test;user=sslclient;" +
           "Certificate Store Location=CurrentUser;" + "SslMode=Required"))
    {
      connection.Open();
    }
    

Параметр отпечатка сертификата

Если у вас есть большое количество сертификатов в хранилище, и у многих из них есть тот же самый Issuer, это может быть источником проблем и привести к неправильно используемому сертификату. Чтобы облегчить эту ситуацию, есть дополнительный параметр отпечатка сертификата, который может дополнительно быть определен как часть строки подключения. Как упомянуто прежде, можно дважды щелкнуть по сертификату в Microsoft Management Console, чтобы показать детали сертификата. Когда диалог сертификата показан, щелкают по вкладке Details и прокручивают вниз, чтобы видеть отпечаток. Он, как правило, будет таким числом, как 47 94 36 00 9a 40 f3 01 7a 14 5c f8 47 9e 76 94 d7 aa de f0. Этот отпечаток может использоваться в строке подключения, как иллюстрирует следующий код:

using (MySqlConnection connection = new MySqlConnection(
       "database=test;user=sslclient;" +
       "Certificate Store Location=CurrentUser;" +
       "Certificate Thumbprint=479436009a40f3017a145cf8479e7694d7aadef0;"+
       "SSL Mode=Required"))
{
  connection.Open();
}

Пробелы в параметре отпечатка опциональны, значение нечувствительно к регистру.

6.11. Обучающая программа: используя MySqlScript

Эта обучающая программа учит вас, как использовать класс MySqlScript. Этот класс позволяет вам выполнить строку запросов. В зависимости от обстоятельств это может быть более удобно, чем использование подхода MySqlCommand.

Более подробная информация о классе MySqlScript может быть найдена в справочной документации, поставляемой с MySQL Connector/NET.

Чтобы управлять примерами программы в этой обучающей программе, настройте простую испытательную базу данных и таблицу, используя клиент mysql или MySQL Workbench. Команды для mysql:

CREATE DATABASE TestDB;
USE TestDB;
CREATE TABLE TestTable (id INT NOT NULL PRIMARY KEY
                        AUTO_INCREMENT, name VARCHAR(100));

Основной метод класса MySqlScript это Execute. Он вызывает скрипт (последовательность запросов) назначенный на значение свойства Query объекта MySqlScript. Свойство Query может быть установлено через конструктор MySqlScript или при помощи параметра Query. Execute возвращает количество выполненных запросов.

Объект MySqlScript выполнит указанный скрипт на связи, используя значение Connection. Это значение может быть установлено непосредственно или через конструктор MySqlScript. Следующие фрагменты кода иллюстрируют это:

string sql = "SELECT * FROM TestTable";
...
MySqlScript script = new MySqlScript(conn, sql);
...
MySqlScript script = new MySqlScript();
script.Query = sql;
script.Connection = conn;
...
script.Execute();

Класс MySqlScript имеет несколько событий, связанных с ним:

  1. Error, если ошибка происходит.

  2. ScriptCompleted, когда скрипт успешно заканчивает выполнение.

  3. StatementExecuted после того, как каждый запрос выполняется.

Возможно назначить обработчики событий на каждое из этих событий. Этот обеспеченный пользователями код вызван, когда связанное событие имеет место. Следующий код показывает, как обработчики событий настраиваются.

script.Error += new MySqlScriptErrorEventHandler(script_Error);
script.ScriptCompleted += new EventHandler(script_ScriptCompleted);
script.StatementExecuted += new MySqlStatementExecutedEventHandler(script_StatementExecuted);

В VisualStudio можно сэкономить ввод при помощи автозавершения, чтобы заполнить программные заглушки. Начните, например, script.Error +=. Нажмите TAB и еще раз TAB. Назначение закончено, и созданный обработчик событий готов. Полный рабочий пример показан ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace MySqlScriptTest
{
  class Program
  {
    static void Main(string[] args)
    {
      string connStr = "server=localhost;user=root;database=TestDB;port=3306;password=******";
      MySqlConnection conn = new MySqlConnection(connStr);
      try
      {
        Console.WriteLine("Connecting to MySQL...");
        conn.Open();
        string sql = "INSERT INTO TestTable(name) VALUES ('Superman');" +
                     "INSERT INTO TestTable(name) VALUES ('Batman');" +
                     "INSERT INTO TestTable(name) VALUES ('Wolverine');" +
                     "INSERT INTO TestTable(name) VALUES ('Storm');";
        MySqlScript script = new MySqlScript(conn, sql);
        script.Error += new MySqlScriptErrorEventHandler(script_Error);
        script.ScriptCompleted += new EventHandler(script_ScriptCompleted);
        script.StatementExecuted += new MySqlStatementExecutedEventHandler(script_StatementExecuted);
        int count = script.Execute();
        Console.WriteLine("Executed " + count + " statement(s).");
        Console.WriteLine("Delimiter: " + script.Delimiter);
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.ToString());
      }
      conn.Close();
      Console.WriteLine("Done.");
    }

    static void script_StatementExecuted(object sender,
                                         MySqlScriptEventArgs args)
    {
      Console.WriteLine("script_StatementExecuted");
    }

    static void script_ScriptCompleted(object sender, EventArgs e)
    {
      /// EventArgs e will be EventArgs.Empty for this method
      Console.WriteLine("script_ScriptCompleted!");
    }

    static void script_Error(Object sender, MySqlScriptErrorEventArgs args)
    {
      Console.WriteLine("script_Error: " + args.Exception.ToString());
    }
  }
}

В обработчике события script_ScriptCompleted параметр EventArgs e должен быть EventArgs.Empty. В случае ScriptCompleted там не дополнительные данные, которые будут получены, поскольку объект события EventArgs.Empty.

Используя разделители с MySqlScript

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

CREATE PROCEDURE test_routine()
BEGIN
  SELECT name FROM TestTable ORDER BY name;
  SELECT COUNT(name) FROM TestTable;
END

Этот код на самом деле должен быть выполнен на MySQL Server как отдельный оператор. Однако с разделителем по умолчанию ; класс MySqlScript интерпретировал бы вышеупомянутое как два запроса, первый:

CREATE PROCEDURE test_routine()
BEGIN
  SELECT name FROM TestTable ORDER BY name;

Выполняя это, запрос произвел бы ошибку. Чтобы решить эту проблему MySqlScript поддерживает способность установить иной разделитель. Это достигается через значение свойства Delimiter. Например, вы могли установить разделитель в ??, в этом случае вышеупомянутый код больше не производил бы ошибку, когда выполнен. Многочисленные запросы могут быть разграничены в скрипте, так например, у вас могло быть три запроса в скрипте, такие как:

string sql = "DROP PROCEDURE IF EXISTS test_routine??" +
             "CREATE PROCEDURE test_routine() " + "BEGIN " +
             "SELECT name FROM TestTable ORDER BY name;" +
             "SELECT COUNT(name) FROM TestTable;" + "END??" +
             "CALL test_routine()";

Можно изменить разделитель назад в любом месте, установив значение Delimiter. Следующий код показывает полный рабочий пример:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace ConsoleApplication8
{
  class Program
  {
    static void Main(string[] args)
    {
      string connStr = "server=localhost;user=root;database=TestDB;port=3306;password=******";
      MySqlConnection conn = new MySqlConnection(connStr);
      try
      {
        Console.WriteLine("Connecting to MySQL...");
        conn.Open();
        string sql ="DROP PROCEDURE IF EXISTS test_routine??" +
                    "CREATE PROCEDURE test_routine() " + "BEGIN " +
                    "SELECT name FROM TestTable ORDER BY name;" +
                    "SELECT COUNT(name) FROM TestTable;" + "END??" +
                    "CALL test_routine()";
        MySqlScript script = new MySqlScript(conn);
        script.Query = sql;
        script.Delimiter = "??";
        int count = script.Execute();
        Console.WriteLine("Executed " + count + " statement(s)");
        script.Delimiter = ";";
        Console.WriteLine("Delimiter: " + script.Delimiter);
        Console.WriteLine("Query: " + script.Query);
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.ToString());
      }
      conn.Close();
      Console.WriteLine("Done.");
    }
  }
}

Поиск

 

Найди своих коллег!

Вы можете направить письмо администратору этой странички, Алексею Паутову. mailto:alexey.v.pautov@mail.ru