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

22.2.4.8. Учебное руководство: Используя MySqlScript

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

Более подробная информация MySqlScript class может быть найден в справочной документации, предоставленной 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 class 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 class есть несколько событий, связанных с этим. Есть:

  1. Ошибка - генерировала, если ошибка происходит.

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

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

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

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

В VisualStudio можно сохранить ввод при использовании завершения вкладки, чтобы заполнить программные заглушки. Запустите, вводя, например, "сценарий. Ошибка + =". Затем нажмите ВКЛАДКУ, и затем нажмите ВКЛАДКУ снова. Присвоение завершается, и тупиковый создаваемый обработчик событий. Полный рабочий пример показывают ниже:

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.

22.2.4.8.1. Используя Разделители с MySqlScript

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

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

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

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