Spec-Zone.ru › MySQL Connectors 1.0

6.8 Учебник: Использование MySqlScript

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

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

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

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

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

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

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

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

  1. Error — генерируется, если произошла ошибка.

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

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

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

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

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

namespace MySqlScriptTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string connStr = "server=localhost;user=root;database=TestDB;port=3306;password=******";
            MySqlConnection conn = new MySqlConnection(connStr);

            try
            {
                Console.WriteLine("Connecting to MySQL...");
                conn.Open();

                string sql = "INSERT INTO TestTable(name) VALUES ('Superman');" +
                             "INSERT INTO TestTable(name) VALUES ('Batman');" +
                             "INSERT INTO TestTable(name) VALUES ('Wolverine');" +
                             "INSERT INTO TestTable(name) VALUES ('Storm');";

                MySqlScript script = new MySqlScript(conn, sql);

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

                int count = script.Execute();

                Console.WriteLine("Executed " + count + " statement(s).");
                Console.WriteLine("Delimiter: " + script.Delimiter);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            conn.Close();
            Console.WriteLine("Done.");
        }

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

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

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

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

Использование разделителей с MySqlScript

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

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

На самом деле эту процедуру необходимо выполнить на сервере MySQL как единый оператор. Однако, с помощью стандартного разделителя “;” класс 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.");
        }
    }
}

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/connector-net-en/connector-net-tutorials-mysqlscript.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API