источник https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-sql-command.html
6.1.1 Объект MySqlConnection
Чтобы приложение MySQL Connector / NET могло подключиться к базе данных MySQL, оно должно установить соединение с помощью MySqlConnection
объекта.
MySqlConnection
Конструктор принимает строку соединения в качестве одного из параметров. Строка подключения предоставляет необходимую информацию для подключения к базе данных MySQL. Строка подключения обсуждается более подробно в главе 4, Соединения / NET-соединения . Список поддерживаемых параметров строки подключения см. В разделе 4.5, «Справочник по параметрам подключения Connector / NET 8.0» .
Следующий код показывает, как создать объект подключения /
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, а также открыть и закрыть соответствующий объект соединения.
MySqlConnection
объекта.MySqlConnection
Конструктор принимает строку соединения в качестве одного из параметров. Строка подключения предоставляет необходимую информацию для подключения к базе данных MySQL. Строка подключения обсуждается более подробно в главе 4, Соединения / NET-соединения . Список поддерживаемых параметров строки подключения см. В разделе 4.5, «Справочник по параметрам подключения Connector / NET 8.0» .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
объект подключения может потерпеть неудачу, генерируя исключение, которое может быть обработано с использованием стандартного кода обработки исключений.Объект MySqlCommand
Когда соединение с базой данных MySQL установлено, следующим шагом является выполнение требуемых операций с базой данных. Это может быть достигнуто за счет использования
MySqlCommand
объекта.
Вы увидите, как создать
MySqlCommand
объект. После того, как он был создан, вы можете вызвать три основных метода:ExecuteReader
запросить базу данных. Результаты обычно возвращаются вMySqlDataReader
объект, созданныйExecuteReader
.ExecuteNonQuery
вставлять, обновлять и удалять данные.ExecuteScalar
вернуть единственное значение.
После того, как
MySqlCommand
объект был создан, вы вызовете один из предыдущих методов для него, чтобы выполнить операцию базы данных, например выполнить запрос. Результаты обычно возвращаются в MySqlDataReader
объект, а затем обрабатываются, например, результаты могут отображаться. Следующий код демонстрирует, как это можно сделать.using System;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;
public class Tutorial2
{
public static void Main()
{
string connStr = "server=localhost;user=root;database=world;port=3306;password=******";
MySqlConnection conn = new MySqlConnection(connStr);
try
{
Console.WriteLine("Connecting to MySQL...");
conn.Open();
string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent='Oceania'";
MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine(rdr[0]+" -- "+rdr[1]);
}
rdr.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
conn.Close();
Console.WriteLine("Done.");
}
}
Когда соединение создано и открыто, код создает
MySqlCommand
объект. Затем выполняемый SQL-запрос передается в MySqlCommand
конструктор. Затем этот ExecuteReader
метод используется для создания MySqlReader
объекта. MySqlReader
Объект содержит результаты , полученные с помощью SQL , выполняемой на объекте команды. Как только результаты были получены в MySqlReader
объекте, результаты могут быть обработаны. В этом случае информация распечатывается while
циклом. Наконец, MySqlReader
объект удаляется путем запуска его Close
метода на нем.
В следующем примере вы увидите, как использовать
ExecuteNonQuery
метод.
Процедура выполнения
ExecuteNonQuery
вызова метода более проста, поскольку нет необходимости создавать объект для хранения результатов. Это потому, что ExecuteNonQuery
используется только для вставки, обновления и удаления данных. Следующий пример иллюстрирует простое обновление Country
таблицы:using System;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;
public class Tutorial3
{
public static void Main()
{
string connStr = "server=localhost;user=root;database=world;port=3306;password=******";
MySqlConnection conn = new MySqlConnection(connStr);
try
{
Console.WriteLine("Connecting to MySQL...");
conn.Open();
string sql = "INSERT INTO Country (Name, HeadOfState, Continent) VALUES ('Disneyland','Mickey Mouse', 'North America')";
MySqlCommand cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
conn.Close();
Console.WriteLine("Done.");
}
}
Запрос строится, объект команды создан и
ExecuteNonQuery
метод вызывается для объекта команды. Вы можете получить доступ к своей базе данных MySQL с помощью интерпретатора команд mysql и убедиться, что обновление было выполнено правильно.
Наконец, вы увидите, как
ExecuteScalar
метод может использоваться для возврата одного значения. Опять же, это просто, так как MySqlDataReader
объект не требуется хранить результаты, подойдет простая переменная. Следующий код иллюстрирует, как использовать ExecuteScalar
:using System; using System.Data; using MySql.Data; using MySql.Data.MySqlClient; public class Tutorial4 { public static void Main() { string connStr = "server=localhost;user=root;database=world;port=3306;password=******"; MySqlConnection conn = new MySqlConnection(connStr); try { Console.WriteLine("Connecting to MySQL..."); conn.Open(); string sql = "SELECT COUNT(*) FROM Country"; MySqlCommand cmd = new MySqlCommand(sql, conn); object result = cmd.ExecuteScalar(); if (result != null) { int r = Convert.ToInt32(result); Console.WriteLine("Number of countries in the world database is: " + r); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } conn.Close(); Console.WriteLine("Done."); } }
В этом примере используется простой запрос для подсчета строк в
Country
таблице. Результат получается при вызове ExecuteScalar
объекта команды.6.1.3 Работа с разделенными данными
Ранее при использовании
MySqlDataReader
соединение с базой данных постоянно поддерживалось, если явно не закрыто. Также возможно работать таким образом, когда соединение устанавливается только при необходимости. Например, в этом режиме может быть установлено соединение для чтения фрагмента данных, а затем данные могут быть изменены приложением по мере необходимости. Соединение может быть восстановлено только в том случае, если и когда приложение записывает данные обратно в базу данных. Это разъединяет рабочий набор данных из базы данных.
Этот разъединенный режим работы с данными поддерживается MySQL Connector / NET. Есть несколько частей, позволяющих этому методу работать:
- Набор данных. Набор данных - это область, в которую загружаются данные для чтения или изменения. Создается
DataSet
экземпляр объекта, который может хранить несколько таблиц данных. - Адаптер данных. Адаптер данных - это интерфейс между набором данных и самой базой данных. Адаптер данных отвечает за эффективное управление подключениями к базе данных, открывая и закрывая их по мере необходимости. Адаптер данных создается путем создания экземпляра объекта
MySqlDataAdapter
класса. УMySqlDataAdapter
объекта есть два основных метода:Fill
который считывает данные в набор данных иUpdate
который записывает данные из набора данных в базу данных. - Командный строитель. Command Builder является вспомогательным объектом. Command Builder работает в сочетании с адаптером данных. Когда
MySqlDataAdapter
объект создается, ему обычно дается начальная инструкция SELECT. Из этогоSELECT
заявления командования Builder может работать соответствующееINSERT
,UPDATE
иDELETE
заявление , которые будут необходимы для обновления базы данных. Чтобы создать Command Builder, создается объект класса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
метод, и адаптер данных знает , как установить соединение с базой данных и извлекать необходимые данные, а затем заполнить набор данных , когда Fill
вызывается метод. Второй параметр « Страна » - это таблица в наборе данных для обновления.
Данные в наборе данных теперь могут обрабатываться приложением по мере необходимости. В какой-то момент изменения данных необходимо будет записать обратно в базу данных. Это достигается с помощью
MySqlDataAdapter
метода, Update
метода.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 обновило данные в трех столбцах: Код, Имя и HeadOfState.
Рисунок 6.1 World Database Application
6.1.4 Работа с параметрами
В этой части руководства показано, как использовать параметры в приложении MySQL Connector / NET.
Хотя можно создавать строки SQL-запроса непосредственно из пользовательского ввода, это не рекомендуется, поскольку не предотвращает ввод ошибочной или вредоносной информации. Безопаснее использовать параметры, так как они будут обрабатываться только как полевые данные. Например, представьте, что следующий запрос был создан из пользовательского ввода:
string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = "+user_continent;
Если строка
user_continent
получена из элемента управления Text Box, потенциально не будет никакого контроля над строкой, введенной пользователем. Пользователь может ввести строку, которая генерирует ошибку во время выполнения, или в худшем случае фактически наносит вред системе. При использовании параметров это невозможно сделать, поскольку параметр всегда обрабатывается только как параметр поля, а не как произвольный фрагмент кода SQL.
Тот же запрос, написанный с использованием параметра для пользовательского ввода:
string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = @Continent";
Заметка
Параметру предшествует символ «@», указывающий, что его следует рассматривать как параметр.
Помимо отметки положения параметра в строке запроса необходимо добавить параметр в объект Command. Это иллюстрируется следующим фрагментом кода:
cmd.Parameters.AddWithValue("@Continent", "North America");
В этом примере строка «Северная Америка» предоставляется в качестве значения параметра статически, но в более практическом примере она будет исходить из пользовательского элемента управления вводом.
Еще один пример иллюстрирует весь процесс:
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.");
}
}
В этой части руководства вы узнаете, как использовать параметры, чтобы сделать ваш код более безопасным.
В этой части руководства показано, как использовать параметры в приложении MySQL Connector / NET.
Комментариев нет:
Отправить комментарий