Spec-Zone .ru
спецификации, руководства, описания, API

21.2.4.1. Учебное руководство: Введение в Программирование Соединителя/Сети

Этот раздел обеспечивает нежное введение в программирование с Соединителем/Сетью. Пример кода пишется в C#, и разрабатывается, чтобы работать и над Microsoft.NET Framework и над Моно.

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

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

Отметить

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

21.2.4.1.1. Объект MySqlConnection

Для Вашего приложения Соединителя/Сети, чтобы соединиться с базой данных MySQL, это должно установить соединение при использовании a MySqlConnection объект.

MySqlConnection конструктор берет строку подключения в качестве одного из ее параметров. Строка подключения предоставляет необходимую информацию, чтобы сделать соединение с базой данных MySQL. Строка подключения обсуждается более полно в Разделе 21.2.5.1, "Соединяясь с MySQL Используя Соединитель/Сеть". Для списка поддерживаемых опций строки подключения см. Раздел 21.2.6, "Ссылка Опций Строки подключения Соединителя/Сети".

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

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, и открыть и закрыть соответствующий объект соединения.

21.2.4.1.2. Объект MySqlCommand

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

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

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

  • ExecuteNonQuery - имел обыкновение вставлять и удалять данные.

  • ExecuteScalar - имел обыкновение возвращать единственное значение.

Однажды a MySqlCommand объект был создан, Вы вызовете один из вышеупомянутых методов на нем, чтобы выполнить работу базы данных, те, которые выполняют запрос. Результаты обычно возвращаются в a 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.");    }}

Когда соединение было создано и открыто, код тогда создает a MySqlCommand объект. Отметьте, что SQL-запрос, который будет выполнен, передают к MySqlCommand конструктор. ExecuteReader метод тогда используется, чтобы генерировать a MySqlReader объект. MySqlReader объект содержит результаты, сгенерированные SQL, выполняемым на объекте команды. Как только результаты были получены в a MySqlReader объект, результаты могут быть обработаны. В этом случае информация распечатывается a 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 метод может использоваться, чтобы возвратить единственное значение. Снова, это является прямым, как a 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 на объекте команды.

21.2.4.1.3. Работа с Разъединенными Данными

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

Этот разъединенный режим работы с данными поддерживается Соединителем/Сетью. Есть несколько частей, включенных в разрешение этого метода работать:

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

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

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

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

Инстанцирование объекта DataSet

A 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 метод является a MySqlDataAdapter метод, Адаптер Данных знает, как установить соединение с базой данных и получить необходимые данные, и затем заполняет Набор данных когда Fill метод вызывают. Второй параметр "Страна" является таблицей в Наборе данных, чтобы обновить.

Обновление Набора данных

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

daCountry.Update(dsCountry, "Country");

Снова, Набор данных и таблица в пределах Набора данных, чтобы обновить определяются.

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

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

В этом примере данные от Мировой базы данных читаются в управление Представлением Сетки Данных. Здесь, данные могут быть просмотрены и изменены прежде, чем нажать кнопку обновления. Кнопка обновления тогда активирует код, чтобы записать изменения обратно к базе данных. Код использует принципы, объясненные выше. Приложение было создано, используя 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!";        }    }}

Выполнение приложения показывают ниже:

Рисунок 21.41. Мировое Приложение базы данных

Мировое Приложение базы данных

21.2.4.1.4. Работа с Параметрами

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

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

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

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

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

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

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

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

cmd.Parameters.AddWithValue("@Continent", "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.");    }}

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

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

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

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

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');

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

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

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

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

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

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

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

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

Полный рабочий код для примера хранимой процедуры показывают ниже:

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.");    }}

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