Следующие обучающие программы MySQL Connector/NET иллюстрируют, как разработать программы MySQL, используя такие технологии, как Visual Studio, C#, ASP.NET и .NET, .NET Core и Mono framework. Начните с первой обучающей программы, которая проверит, что вы установили правильные компоненты программного обеспечения, затем выберите другие обучающие программы, чтобы попробовать в зависимости от функций, которые вы намереваетесь использовать в ваших приложениях.
Эта секция обеспечивает введение в программирование на MySQL Connector/NET. Пример кода написан на C# и разработан, чтобы работать с Microsoft .NET Framework и Mono.
Эта обучающая программа разработана, чтобы начать работу с Connector/NET как можно быстрее, это не вдается в подробности ни по какой конкретной теме. Однако следующие разделы этого руководства описывают каждую из тем, введенных в этой обучающей программе более подробно. В этой обучающей программе вы поощряетесь править код, изменяя его как требуется для вашей установки.
Эта обучающая программа предполагает, что у вас уже есть MySQL и
Connector/NET. Это также предполагает, что вы установили
образец базы данных world
,
который может быть загружен с
MySQL Documentation page. Можно также найти детали о том, как установить
базу данных на той же самой странице.
Прежде, чем собрать пример кода, удостоверьтесь, что вы добавили
ссылки на свой проект как требуется. Требуемые ссылки:
are System
,
System.Data
и
MySql.Data
.
Чтобы приложение 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, открыть и закрыть соответствующий объект связи.
Когда связь была установлена с базой данных 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
на объекте команды.
Ранее, используя MySqlDataReader
,
связь с базой данных все время сохранялась, если явно не закрыта.
Также возможно работать способом, где связь устанавливается только при
необходимости. Например, в этом способе, связь могла быть установлена, чтобы
прочитать кусок данных, данные тогда могли быть изменены приложением как
требуется. Связь тогда могла быть восстановлена, только если и когда
приложение написало данные в ответ базе данных.
Это отцепляет рабочий набор данных от базы данных.
Этот расцепленный способ работы с данными поддерживается MySQL Connector/NET. Есть несколько частей, вовлеченных в работу этого метода:
Набор данных. Набор данных это
область, в которой данные загружаются, чтобы прочитать или изменить.
Объект DataSet
экземплируется, который может
сохранить многократные таблицы данных.
Адаптер данных. Адаптер данных это интерфейс между набором
данных и самой базой данных. Адаптер данных ответственен за эффективное
управление связью с базой данных, открывая и закрывая их как требуется.
Адаптер данных создается, экземплируя объект класса
MySqlDataAdapter
. Объект
MySqlDataAdapter
имеет два основных метода:
Fill
, который читает данные в набор данных и
Update
, который пишет данные из
набора данных в базу данных.
Строитель команды. Строитель команды это
объект поддержки. Строитель команды работает вместе с адаптером данных. Когда
MySqlDataAdapter
создается, ему, как правило,
дают начальный оператор SELECT. От этого
SELECT
строитель команды может разработать
передачу запросов INSERT
,
UPDATE
и
DELETE
, которые потребовались бы, чтобы
обновлять базу данных. Чтобы создать строителя команды, надо создать объект
класса MySqlCommandBuilder
.
Каждый из этих классов будет теперь обсужден более подробно.
Объект DataSet
может быть создан просто, как показано в следующем фрагменте кода:
DataSet dsCountry; ... dsCountry = new DataSet();
Хотя это создает объект DataSet
,
это еще не наполнило его данными. Для этого требуется адаптер данных.
MySqlDataAdapter
может быть создан, как
иллюстрировано следующим примером:
MySqlDataAdapter daCountry; ... string sql = "SELECT Code, Name, HeadOfState FROM Country WHERE Continent='North America'"; daCountry = new MySqlDataAdapter (sql, conn);
MySqlDataAdapter
дан SQL-определением данных.
Когда создан 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 является таблицей в наборе
данных, чтобы обновить.
Данными в наборе данных может теперь управлять приложение как требуется.
В какой-то момент изменения данных должны быть написаны в ответ базе данных.
Это достигается через метод 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
Эта часть обучающей программы показывает вам, как использовать параметры в вашем приложении 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."); } }
В этой части обучающей программы вы видите, как использовать параметры, чтобы сделать ваш код более безопасным.
Эта секция иллюстрирует, как работать с хранимыми процедурами. Помещение
интенсивных действий базы данных в хранимые процедуры позволяет вам
определить 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.
Много веб-сайтов показывают средство для пользователя, чтобы создать учетную запись пользователя. Они могут зарегистрироваться на веб-сайте и наслаждаться персонализированным опытом. Это требует, чтобы разработчик создал таблицы базы данных, чтобы хранить пользовательскую информацию, наряду с кодом, чтобы собрать и обработать эти данные. Это представляет проблему разработчику и есть возможность для проблем безопасности. Однако, 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 или выше для этой обучающей программы.
Создайте новую базу данных MySQL, используя программу
MySQL Client (mysql
)
или другой подходящий инструмент. Не имеет значения, какое имя используется
для базы данных, но сделайте его запись. Вы определяете его в строке
подключения, построенной позже в этой обучающей программе. Эта база данных
содержит таблицы, автоматически составленные для вас позже, используемые,
чтобы хранить данные о пользователях и ролях.
Создайте новый веб-сайт ASP.NET в Visual Studio. Если вы не уверены, как сделать это, обратитесь к разделу 6.7, который демонстрирует, как создать простой веб-сайт ASP.NET.
Добавьте ссылки на MySql.Data
и
MySql.Web
к проекту веб-сайта.
Определите местонахождение файла
machine.config
на вашей системе, который
является конфигурационным файлом для .NET Framework.
Найдите файл machine.config
, чтобы найти
поставщика членства MySQLMembershipProvider
.
Добавьте признак 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 тихо создавать или модернизировать схему на сервере базы
данных, содержащую необходимые таблицаы для того, чтобы
хранить информацию членства.
Теперь необходимо создать строку подключения, на которую ссылаются в
предыдущем шаге. Загрузите файл web.config
для веб-сайта в Visual Studio.
Определите местонахождение секции отмеченной
<connectionStrings>
.
Добавьте следующую информацию о строке подключения.
<connectionStrings> <remove name="LocalMySqlServer"/> <add name="LocalMySqlServer" connectionString="Datasource=localhost;Database=users;uid=root;pwd=password" providerName="MySql.Data.MySqlClient"/> </connectionStrings>
Определенная база данных является, созданной в первом шаге. Вы, возможно, альтернативно использовали существующую базу данных.
В этом пункте надо гарантировать, что никакие ошибки не присутствуют. Это может быть сделано выбором F6.
, из главного меню или нажатиемASP.NET поддерживает понятие локально и удаленно авторизованных пользователей. С локальной аутентификацией пользователь утвержден, используя авторизацию Windows, когда он пытается получить доступ к веб-сайту. Это может быть полезно в интранет-среде. С удаленной аутентификацией пользователь запрошен для ввода данных для входа в систему, получая доступ к веб-сайту, и эти данные сравнены с информацией членства, хранящейся в сервере базы данных, таком как MySQL Server. Вы будете теперь видеть, как выбрать эту форму идентификации.
Запустите ASP.NET Website Administration Tool. Это может быть сделано быстро, щелкнув по маленькому символу молотка и Земли в Solution Explorer. Можно также запустить этот инструмент, выбрав
и из главного меню.В ASP.NET Website Administration Tool перейдите на вкладку Security и сделайте следующее:
Нажмите ссылку User Authentication Type.
Выберите опцию From the internet. Веб-сайт должен будет теперь обеспечить форму, чтобы позволить пользователю ввести данные для входа в систему. Детали будут сравнены с информацией членства в базе данных MySQL.
Теперь необходимо определить роль и поставщика членства, чтобы использовать. Щелкните по вкладке Provider и сделайте следующее:
Нажмите ссылку Select a different provider for each feature (advanced).
Для поставщика членства выберите MySQLMembershipProvider, для ролевого поставщика выберите MySQLRoleProvider.
В Visual Studio восстановите решение при нажатии
и из главного меню.Проверьте, что необходимая схема была создана. Это может быть
достигнуто, используя 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)
Можно теперь создать пользователей и роли для веб-приложения. Самый легкий способ сделать это с ASP.NET Website Administration Tool. Однако много веб-приложений содержат свои собственные модули для создания ролей и пользователей. Для простоты ASP.NET Website Administration Tool будет использоваться в этой обучающей программе.
В ASP.NET Website Administration Tool перейдите на вкладку Security. Теперь, когда членство и ролевой поставщик позволены, вы будете видеть связи для создания ролей и пользователей. Нажмите Create or Manage Roles .
Можно теперь ввести имя новой роли и нажать
, чтобы создать новую роль. Создайте новые роли как требуется.Нажмите кнопку
.Нажмите Create User. Можно теперь заполнить информацию о пользователе, а также ассигновать того пользователя одной или более ролям.
Используя интерпретатор команд mysql, можно проверить, что база данных была правильно наполнена ролевыми данными и членством.
mysql> SELECT * FROM my_aspnet_users;
mysql>SELECT * FROM my_aspnet_roles;
В этой обучающей программе вы видели, как настроить членство в 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:
Создайте новый веб-проект ASP.NET.
Выберите инструмент MySQL Application Configuration tool.
В MySQL Application Configuration перейдите на страницу Profiles (см. Profiles Provider).
Отметьте Use MySQL to manage my profiles .
Отметьте Autogenerate Schema.
Нажмите
и затем сформируйте строку подключения для базы данных, которая будет использоваться, чтобы хранить информацию профиля пользователя.Перейдите к последней странице инструмента и нажмите
, чтобы сохранить ваши изменения и выйти из инструмента.В этом пункте вы теперь готовы начать использовать MySQL Profile Provider. Со следующими шагами можно выполнить предварительный тест на установку.
Откройте файл web.config
.
Добавьте простой профиль, такой как следующий пример.
<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
,
следующий шаг должен написать некоторый код, чтобы проверить профиль.
В Design View спроектируйте простую страницу с добавленными средствами управления. Следующие данные показывают вкладку Default.aspx, открытую с текстовым окном, списком и кнопками управления.
Рис. 6.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; } ...
Сохраните все файлы и постройте решение, чтобы проверить, что никакие ошибки не были допущены.
Запустите приложение.
Введите свое имя, возраст и выберите цвет из списка. Теперь сохраните эту информацию в своем профиле при нажатии
.Отбор цвета из списка использует цвет по умолчанию,
Blue, который был определен в файле
web.config
.
Нажмите
, чтобы очистить текст в текстовых окнах и этикетке, которая показывает ваш выбранный цвет.Нажмите
, чтобы восстановить ваши данные профиля из базы данных MySQL.Теперь выйдите из браузера, чтобы закончить приложение.
Запустите приложение снова, которое также восстанавливает вашу информацию профиля из базы данных MySQL.
В этой обучающей программе вы видели как использовать поставщика профиля MySQL с Connector/NET.
MySQL Connector/NET предоставляет веб-поставщик персонализации, который позволяет вам использовать сервер MySQL, чтобы хранить данные о персонализации.
Эта опция была добавлена в Connector/NET 6.9.0.
Эта обучающая программа демонстрирует, как формировать веб-поставщика персонализации, использующего Connector/NET.
Веб-сайт ASP.NET или веб-приложение с поставщиком членства.
.NET Framework 3.0.
MySQL 5.5.
Чтобы сформировать поставщика, сделайте следующее:
Добавьте ссылки на
MySql.Data
и
MySql.Web
к веб-сайту или
проекту веб-приложения.
Включите поставщика персонализации 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>
Чтобы создать веб-средства управления, выполните эти шаги:
Создайте веб-приложение, используя Connector/NET ASP.NET Membership. Для получения информации о выполнении этого посмотрите раздел 6.2.
Создайте новую страницу ASP.NET и затем измените на Design view.
Из Toolbox перетащите WebPartManager на страницу.
Определите HTML-таблицу с тремя колонками и одной строкой.
Из WebParts Toolbox перетащите
WebPartZone
в первую и во
вторую колонки.
Из WebParts Toolbox перетащите
CatalogZone
с
PageCatalogPart
и
EditorZone
в третью колонку.
Добавьте средства управления к
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>
За пределами 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>
Следующий код заполняет список для режимов отображения, показывает текущий объем, перезагружает состояние персонализации, переключает тип объема (между пользователем и общим объемом) и изменяет режим отображения.
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; } } }
Используйте следующие шаги, чтобы проверить ваши изменения:
Запустите приложение и откройте веб-страницу.
Страница должна быть похожей на пример, показанный на следующем
рисунке, на котором кнопка Toggle Scope установлена в
Shared
. Страница также включает выпадающий
список, кнопку Reset и средства управления Left Zone и Main Zone.
Рис. 6.3. Веб-страница
Первоначально, когда учетная запись пользователя не авторизована, объем
scope is Shared по умолчанию.
Учетная запись пользователя должна быть авторизована, чтобы изменить
настройки на средствах управления. Следующие данные показывают пример, в
котором пользователь в состоянии настроить средства управления при помощи
выпадающего списка Browse. Варианты в списке:
Design
,
Catalog
и
Edit
.
Рис. 6.4. Средства управления
Нажмите
, чтобы переключить приложение назад к общему объему.Теперь можно персонализировать зоны, используя режимы отображения
Edit
или
Catalog
в определенном пользователе или общем
уровне. Дальше показан Catalog
выбранный из выпадающего списка, который включает элемент Catalog Zone,
который был добавлен ранее.
Рис. 6.5. Personalize Zones
Эта секция документирует способность использовать простого поставщика членства на шаблоне 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.
Чтобы начать новый проект, сделайте следующее:
Откройте Visual Studio, создайте новый проект типа веб-приложения ASP.NET MVC 4 Web Application и сформируйте проект, чтобы использовать .NET Framework 4.5.
Рис. 6.6. Simple Membership: новый проект
Выберите шаблон и движок просмотра. Эта обучающая программа использует Internet Application Template с движком Razor. Произвольно, можно добавить единицу тестового проекта выбором Create a unit test project.
Рис. 6.7. Simple Membership: выбор шаблона и движка
Добавьте ссылки на сборки MySql.Data
,
MySql.Data.Entities
и
MySql.Web
. Выбранные сборки должны
соответствовать версиям .NET Framework и Entity Framework,
добавленным к проекту шаблоном.
Добавьте действительную последовательность подключения MySQL в файл
web.config
, подобно следующему примеру.
<add name="MyConnection" connectionString="server=localhost; UserId=root; password=pass; database=MySqlSimpleMembership; logging=true;port=3305" providerName="MySql.Data.MySqlClient"/>
Под узлом <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>
Обновите конфигурацию с действительными значениями
для следующих свойств: connectionStringName
,
userTableName
,
userIdColumn
,
userNameColumn
и
autoGenerateTables
.
userTableName
:
Название таблицы, чтобы хранить пользовательскую информацию.
Эта таблица независима от схемы, произведенной поставщиком, и это может
быть изменено в будущем.
userId
:
Название колонки, которая хранит ID для записей в
userTableName
.
userName
:
Название колонки, которая хранит имя пользователя для записей в
userTableName
.
connectionStringName
:
Это значение должно соответствовать строке подключения, определенной в
файле web.config
.
autoGenerateTables
: Должно быть
false
, если таблица уже существует.
Обновите ваш класс DBContext
с формируемым именем строки подключения.
Откройте файл
InitializeSimpleMembershipAttribute.cs
из каталога
Filters/
и найдите класс
SimpleMembershipInitializer
.
Найдите вызов метода
WebSecurity.InitializeDatabaseConnection
и обновите параметры с конфигурацией для
connectionStringName
,
userTableName
,
userIdColumn
и
userNameColumn
.
Если база данных в строке подключения не существует, то создайте ее.
После запуска веб-приложением произведенная домашняя страница показана на рисунке.
Рис. 6.8. Simple Membership: произведенная домашняя страница
Если приложение выполнилось нормально, то произведенная схема будет подобна следующему рисунку, показывающему обозреватель объектов, открытый для таблиц.
Рис. 6.9. Simple Membership: произведенная схема и таблицы
Чтобы создать пользовательский логин, нажмите
на произведенной веб-странице. Напечатайте имя пользователя и пароль, затем выполните регистрацию. Это действие перенаправляет к домашней странице с недавно созданным пользователем.Данные для недавно созданного пользователя могут быть расположены в
таблицах UserProfile
и
Webpages_Membership
.
OAuth это другой вариант аутентификации для веб-сайтов, которые используют простого поставщика членства. Пользователь может быть проверен, используя внешнюю учетку, например, для Facebook, Twitter, Google и другие.
Используйте следующие шаги, чтобы позволить идентификацию, используя учетку Google в приложении:
Найдите файл AuthConfig.cs
в каталоге App_Start
.
Поскольку эта обучающая программа использует Google, найдите метод
RegisterAuth
и раскомментируйте последнюю строку, где это вызывает
OauthWebSecurity.RegisterGoogleClient
.
Запустите приложение. Когда оно работает, нажмите Use another service to log in.
, чтобы открыть регистрацию на странице. Затем нажмите подРис. 6.10. Simple Membership с OAuth: Google Service
Это действие перенаправляет к странице входа в систему Google (на google.com) и запросит сведения о вашей учетной записи Google.
После предоставления правильных данных сообщение просит разрешение для вашего запроса получить доступ к информации пользователя. Прочитайте описание и затем нажмите
, чтобы позволить указанные действия и перенаправить назад к странице входа в систему.Приложение теперь может зарегистрировать учетку. Поле User name будет заполнено соответствующей информацией (в этом случае адрес электронной почты, который связан с учеткой Google). Нажмите , чтобы зарегистрировать пользователя в вашем приложении.
Теперь новый пользователь зарегистрирован от внешнего источника, используя
OAuth. Информация о новом пользователе хранится в таблицах
UserProfile
и
Webpages_OauthMembership
.
Чтобы использовать другой внешний выбор для аутентификации пользователя, необходимо включить клиент в том же самом классе, где мы включили Google в этой обучающей программе. Как правило, поставщики требуют, чтобы вы зарегистрировали свое приложение прежде, чем позволить идентификацию OAuth, и после регистрации они, как правило, обеспечивают символ/ключ и ID, который должен использоваться, регистрируя поставщика в приложении.
Эта обучающая программа описывает, как создать источник данных Windows Forms из Entity в Entity Data Model через Microsoft Visual Studio.
Чтобы выполнить шаги в этой обучающей программе, сначала установите
образец базы данных world
, который можно
загрузить с MySQL Documentation page. Можно также найти детали о том,
как установить базу данных на той же самой странице.
Первый шаг должен создать новое приложение Windows Forms.
В Visual Studio выберите
, и из главного меню.Выберите установленный шаблон Windows Forms Application, нажмите . Решение создается.
Чтобы приобрести последнюю сборку Entity Framework для MySQL, загрузите пакет NuGet. Альтернативно, используйте инструмент MySQL Application Configuration в MySQL for Visual Studio 1.2.9 (или выше), чтобы приобрести последний пакет и скоординировать конфигурацию. Для получения дополнительной информации об использовании инструмента, посмотрите Entity Framework.
Чтобы добавить Entity Data Model к вашему решению, сделайте следующее:
В Solution Explorer щелкните правой кнопкой мыши по своему приложению и выберите Visual Studio installed templates выберите ADO.NET Entity Data Model. Нажмите .
и . ВРис. 6.11. Добавляем Entity Data Model
Вы будете теперь видеть мастера Entity Data Model.
Вы будете использовать мастера, чтобы произвести Entity Data Model
из образца базы данных. world
.
Выберите символ EF Designer from database (или
Generate from database в более старых версиях
Visual Studio). Нажмите .
Можно теперь выбрать соединение
localhost(world)
, которое
вы сделали ранее к базе данных. Выберите следующие пункты:
Да, включать уязвимые данные в строку подключения.
Сохраните настройки подключения entity в
App.config
:
worldEntities
Если вы еще не сделали так, можно создать новую связь в это время при нажатии Making a Connection.
. Для дополнительных инструкций относительно создания связи с базой данных посмотритеРис. 6.12. Мастер Entity Data Model: соединение
Обратите внимание на настройки подключения, которые будут использоваться в
App.Config
, поскольку они будут использоваться
позже, чтобы написать необходимый управляющий код. Нажмите
.
Мастер Entity Data Model Wizard соединяется с базой данных.
Как следующие данные показывают, вы получаете древовидную структуру базы данных. Отсюда можно выбрать объект, который требуется включить в модель. Если вы также создали обзоры и сохраненные подпрограммы, эти пункты будут показаны наряду с любыми таблицами. В этом примере просто необходимо выбрать таблицы. Нажмите
, чтобы создать модель и выйти из мастера.Рис. 6.13. Мастер Entity Data Model: объекты и настройки
Visual Studio производит модель с тремя таблицами (city, country и countrylanguage), затем их показывает.
Рис. 6.14. Диаграмма Entity Data Model
Из главного меню Visual Studio выберите
и , чтобы гарантировать, что все собирается правильно.Теперь вы будете добавлять новый источник данных к своему проекту и видеть, как он может использоваться, чтобы читать и писать базу данных.
Из главного меню Visual Studio выберите
и . Откроется мастер Data Source Configuration Wizard.Выберите Object и нажмите .
Выберите объект. Раскройте дерево, как показано ниже.
В этой обучающей программе вы выберете таблицу city. После того, как таблица была отобрана, нажмите
.Рис. 6.15. Мастер Data Source Configuration
Мастер подтвердит, что объект добавлен. Нажмите
.Объект city теперь появится в группе источников данных. Если группа источников данных не показана, выберите
и из главного меню Visual Studio. Состыкованная панель тогда будет показана.Этот шаг описывает, как использовать источник данных в Windows Form.
В панели Data Sources выбираете источник данных, который вы создали и просто перетаскиваете его в Form Designer. По умолчанию объект источника данных будет добавлен как Data Grid View.
Data Grid View связан с
cityBindingSource
, Navigator связан с
cityBindingNavigator
.
Рис. 6.16. Data Form Designer
Сохраните и восстановите решение перед продолжением.
Вы теперь готовы добавить код, чтобы гарантировать, что Data Grid View будет наполнен данными из таблицы city базы данных.
Дважды щелкните по форме, чтобы получить доступ к ее коду.
Добавьте следующий код, чтобы создать экземпляр объекта
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(); } } }
Сохраните и восстановите решение.
Запустите решение. Подтвердите, что сетка наполнена (см. следующий рисунок для примера), и что можно работать с базой данных.
Рис. 6.17. Наполненный Grid Control
Обязательный исходный компонент Binding гарантирует, что изменения, сделанные в Data Grid View, также внесены в классы Entity, связанные с ним. Однако, те данные должны быть сохранены назад из entities в базу данных. Это может быть достигнуто предоставлением возможности кнопки Save в навигаторе и добавлением некоторого кода.
В Form Designer щелкните по символу сохранения
на панели инструментов формы и подтвердите, что ее свойство
Enabled=True
.
Дважды щелкните по символу сохранения на панели инструментов формы, чтобы показать код.
Добавьте следующий (или подобный) код, чтобы гарантировать, что данные сохраняются в базе данных, когда пользователь нажимает кнопку в приложении.
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(); }
Когда код был добавлен, сохраните решение и затем соберите его. Запустите приложение и проверьте, что изменения, внесенные в сетке, сохранены.
В этой обучающей программе вы создаете веб-страницу ASP.NET, которая связывает запросы LINQ с Entity Framework, используя отображение с MySQL Connector/NET.
Если вы еще не сделали этого, установите образец базы данных
world
до попытки работы с этой обучающей
программой. Посмотрите, например,
раздел 6.6 для получения инструкций относительно загрузки и установки
этой базы данных.
В этой части обучающей программы вы создаете веб-сайт ASP.NET.
Веб-сайт использует базу данных world
.
Главная веб-страница показывает выпадающий список, из которого можно выбрать
страну. Данные о городах той страны тогда будут показаны в GridView.
В главном меню Visual Studio выберите
, и .Из установленных шаблонов Visual Studio выберите ASP.NET Web Site. Нажмите . Вы получите представление Source вашей веб-страницы по умолчанию.
Щелкните по вкладке Design, расположенной под группой представления Source.
В панели Design введите некоторый текст, чтобы украсить чистую веб-страницу.
Нажмите Toolbox. Из списка средств управления выберите DropDownList. Перетащите его ниже текста на вашей веб-странице.
Из контекстного меню DropDownList гарантируйте, что флажок Enable AutoPostBack включен. Это гарантирует, что обработчик событий контроля вызывают, когда пункт выбран. Выбор пользователя будет в свою очередь использоваться, чтобы наполнить GridView.
Из Toolbox выберите GridView. Перетащите GridView чуть ниже выпадающего списка, который вы уже поместили.
Следующие данные показывают пример декоративного текста и двух средств
управления на вкладке Design. Добавленный GridView произвел сетку с тремя
колонками (Column0
,
Column1
и
Column3
) и последовательность
abc
в каждой клетке сетки.
Рис. 6.18. Установленный GridView
Рекомендуется, чтобы вы сохранили и построили решение, чтобы гарантировать, что нет никаких ошибок.
Если вы будете управлять решением, то будете видеть, что текст и выпадающий список показаны, но список пуст. Кроме того, представление сетки не появляется вообще. Добавление этой функциональности описано в следующих разделах.
На данном этапе у вас есть веб-сайт, который построен,
но дальнейшая функциональность пока еще требуется. Следующий шаг должен будет
использовать Entity Framework, чтобы создать отображение из базы данных
world
в entities, которыми
можно управлять программно.
На этой стадии обучающей программы вы добавите ADO.NET Entity Data Model
к своему проекту, используя базу данных world
на уровне хранения. Процедура, чтобы сделать это, описана в
разделе 6.6.
В этой части обучающей программы вы напишете код, чтобы наполнить DropDownList. Загрузка веб-страницей данных, чтобы наполнить список, будет достигнуто при помощи результатов запроса LINQ на модели, созданной ранее.
В группе Design дважды щелкните по любой чистой области.
Это откроет метод Page_Load
.
Измените соответствующий раздел кода согласно следующему примеру листинга.
... 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(); } } ...
Список должен быть наполнен только когда страница загружается. Условный код гарантирует, что, если страница впоследствии перезагружается, список не наполнен повторно, что потеряло бы пользовательский выбор.
Сохраните решение, постройте его и запустите. Необходимо видеть, что список был наполнен. Можно выбрать пункт, но пока еще GridView не появляется.
В этом пункте вы имеете рабочий Drop Down List, наполненный запросом LINQ на вашей модели данных.
В последней части этой обучающей программы вы наполните Grid View, используя запрос LINQ на вашей модели данных.
В представлении Design дважды щелкните по
DropDownList. Это действие вызывает код
SelectedIndexChanged
.
Этот метод вызывают, когда пользователь выбирает пункт в списке
и таким образом производит событие AutoPostBack.
Измените соответствующий раздел кода соответственно следующему примеру листинга.
... 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 на модели данных.
Сохраните, соберите и запустите приложение.
Когда вы выбираете страну, вы будете видеть, что ее города показаны в
GridView. Следующие данные показывают Бельгию, выбранную из поля списка и
таблицу с тремя колонками: Name
,
Population
и
CountryCode
.
Рис. 6.19. Рабочий веб-сайт
В этой обучающей программе вы видели, как создать веб-сайт ASP.NET, вы также видели, как можно получить доступ к базе данных MySQL, используя запросы LINQ на модели данных.
Эта обучающая программа демонстрирует, как создать MySQL DDL из модели Entity Framework. Минимально вам будет нужен Microsoft Visual Studio 2017 и MySQL Connector/NET 6.10.
Создайте новое консольное приложение в Visual Studio 2017.
Используя Solution Explorer,
добавьте ссылку на MySql.Data.Entity
.
Из Solution Explorer выберите , . В диалоге Add New Item выберите Online Templates. Выберите ADO.NET Entity Data Model и нажмите , чтобы открыть диалог Entity Data Model.
В диалоге Entity Data Model выберите Empty Model. Нажмите , чтобы создать пустую модель.
Создайте простую модель. Единственный Entity сделан в целях этой обучающей программы.
На панели Properties выберите из списка.
На панели Properties выберите DDL Generation Template в категории Database Script Generation.
Для свойства DDL Generation выберите из списка.
Сохраните решение.
Щелкните правой кнопкой мыши по пустому месту в области проектирования, чтобы открыть контекстне меню. Из меню выберите Generate Database Wizard.
, чтобы открыть диалогВ диалоге Generate Database Wizard выбирают существующую связь или создают новую связь с сервером. Выберите подходящий вариант, чтобы показать или скрыть уязвимые данные. В целях этой обучающей программы можно выбрать Yes, хотя вы могли бы пропустить это для коммерческого применения.
Нажмите
, чтобы произвести MySQL-совместимый DDL-код и затем , чтобы выйти из мастера.Вы видели, как создать код MySQL DDL из модели Entity Framework.
Эта обучающая программа обеспечивает инструкции о том, как начать использовать 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
:
Скачайте world_x.zip
с
http://dev.mysql.com/doc/index-other.html.
Извлеките инсталляционный архив в какое-то место, например,
в /tmp/
.
Распаковывание архива приводит к двум файлам, один из них
world_x.sql
.
Соединитесь с сервером MySQL, используя MySQL Client:
shell> mysql -u root -p
Введите свой пароль. Не-root может использоваться, пока есть привилегии создать новые базы данных. Для получения дополнительной информации об использовании MySQL Client см. mysql The MySQL Command-Line Client.
Выполните скрипт world_x.sql
, чтобы
создать структуру базы данных и вставить данные следующим образом:
mysql> SOURCE /temp/world_x.sql;
Замените /temp/
на путь к файлу
world_x.sql
в вашей системе.
Создайте новый консольный проект в 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(); } } }
В этой обучающей программе вы изучите, как можно использовать 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:
В конфигурационном файле 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 .
Создайте тестовую учетную запись, чтобы использовать в этой обучающей
программе и установите требование 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.
Прямое использование сертификатов формата PEM было введено, чтобы упростить управление сертификатами в многоплатформенной окружающей среде, которая включает подобные продукты MySQL. В предыдущих версиях Connector/NET ваш единственный выбор состоял в том, чтобы использовать зависимые от платформы сертификата форматы PFX.
Для этого примера используйте испытательные сертификаты клиента из
хранилища сервера MySQL
(
).
В вашем приложении добавьте строку подключения, используя базу данных
server-repository-root
/mysql-test/std_datatest
и пользователя
sslclient
:
Установите опцию SslMode
к необходимому уровню безопасности. Сертификаты PEM требуются только для
for VerifyCA
и
VerifyFull
. Все другие значения режима
игнорируют сертификат, даже если им его предоставляют.
using (MySqlConnection connection = new MySqlConnection( "database=test;user=sslclient;" + "SslMode=VerifyFull"
Добавьте соответствующие сертификаты SSL. Поскольку эта обучающая
программа устанавливает опцию SslMode
=
VerifyFull
, необходимо также предоставить
значения для опций SslCa
,
SslCert
и SslKey
.
Каждый выбор должен указать на файл с расширением
.pem
.
"SslCa=ca.pem;" + "SslCert=client-cert.pem;" + "SslKey=client-key.pem;"))
Альтернативно, если вы устанавливаете режим SSL в
VerifyCA
, нужна только опция
SslCa
.
Откройте связь. Следующий пример открывает связь, используя классический протокол 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.
.NET не оказывает поддержку формата PEM. Вместо этого Windows
включает хранилище сертификата, которое предоставляет зависимые от платформы
сертификата в формате PFX. В целях этого примера используйте испытательные
сертификата клиента из хранилища сервера MySQL
(./mysql-test/std_data
). Преобразуйте их
сначала к PFX-формату. Этот формат также известен как PKCS#12.
Чтобы закончить шаги в этой обучающей программе для сертификатов PFX, у вас должен быть установлен Open SSL. Это может быть загружено для Microsoft Windows бесплатно с Shining Light Productions.
Из каталога
:server-repository-root
/mysql-test/std_data
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem \ -certfile cacert.pem -out client.pfx
Когда спросят относительно экспортного пароля, введите пароль
pass. Файл client.pfx
создан. Этот файл используется в обучающей программе.
Используйте файл 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
.
Первый шаг должен импортировать файл PFX
client.pfx
в Personal Store.
Дважды щелкните по файлу в Windows Explorer.
Это запустит Certificate Import Wizard.
Выполните шаги, продиктованные мастером, и на запрос пароля для файла PFX введите pass.
Нажмите
, чтобы закрыть мастер и импортировать сертификат в хранилище.Запустите Microsoft Management Console, вводом в
командную строку mmc.exe
.
Выберите Certificates.
из меню , нажмите . Из списка доступных оснасток выберитеВ диалоге нажмите My user account. Этот выбор используется для личных сертификатов.
и выберите опциюНажмите
.Нажмите
, чтобы закрыть диалог Add/Remove Snap-in.У вас теперь есть Certificates Current User в левой панели Microsoft Management Console. Разверните пункт дерева Certificates - Current User и выберите Personal, Certificates. Правая панель показывает сертификат в MySQL, который был ранее импортирован. Дважды щелкните по сертификату, чтобы показать его детали.
После того, как вы импортировали сертификат в 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(); }
Пробелы в параметре отпечатка опциональны, значение нечувствительно к регистру.
Эта обучающая программа учит вас, как использовать класс
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 имеет несколько событий, связанных с ним:
Error, если ошибка происходит.
ScriptCompleted, когда скрипт успешно заканчивает выполнение.
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
.
В зависимости от природы скрипта вам, возможно, понадобится контроль разделителя, чтобы отделить запросы, которые составят скрипт. Наиболее распространенный пример этого: у вас есть сохраненный мультизапрос как часть вашего скрипта. В этом случае, если используется разделитель по умолчанию ;, вы получите ошибку, когда вы попытаетесь выполнить скрипт. Например:
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."); } } }