C #, MySQL, ADO.NET, разделитель, вызывающий синтаксическую ошибку - PullRequest
6 голосов
/ 25 августа 2009

У меня есть код C #, который циклически просматривает .sql файлы и выполняет то, что внутри них, для настройки базы данных.

Один .sql файл в основном выглядит следующим образом:

DROP PROCEDURE IF EXISTS myProc;

DELIMITER $$

CREATE PROCEDURE myProc()
BEGIN
-- procedure stuff goes here
END $$

DELIMITER ;

CALL myProc();

Когда я ввожу это в окно скрипта MySQL Query Browser, оно работает идеально ... снова и снова, как и хотелось бы.

Однако, если я положу строку в IDbCommand и выполню ее ...

connection.Open(); // An IDbConnection
IDbTransaction transaction = connection.BeginTransaction();
using (IDbCommand cmd = connection.CreateCommand())
{
    cmd.Connection = connection;
    cmd.Transaction = transaction;
    cmd.CommandText = line;
    cmd.CommandType = CommandType.Text;

    try
    {
        cmd.ExecuteNonQuery();
    }
    catch (SqlException ex)
    {
        transaction.Rollback();
        return false;
    }
}

transaction.Commit();
connection.Close();

... я получаю страшное исключение 1064 ...

У вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного использования синтаксиса около 'РАЗДЕЛИТЕЛЬ $$ ПРОЦЕДУРА СОЗДАНИЯ myProc () НАЧИНАЕТСЯ ...

Итак, вопрос в том ... почему MySQL позволяет мне делать это без проблем, но когда я пытаюсь запустить его из C #, он терпит неудачу? И, конечно, второй вопрос, как я должен это исправить.

Ответы [ 3 ]

6 голосов
/ 14 февраля 2015

Для тех, кто ищет быстрый фрагмент ...

var connectionString = @"server=ChangeMe;user=ChangeMe;pwd=ChangeMe;database=ChangeMe;"; 

var scriptText = File.ReadAllText(@"C:\script.sql");

using (var connection = new MySqlConnection(connectionString))
{
    var script = new MySqlScript(connection, scriptText);
    connection.Open();
    script.Execute();
}  
2 голосов
/ 25 августа 2009
0 голосов
/ 25 августа 2009

Некоторые команды в вашем сценарии интерпретируются клиентом mysqlk, который может быть выполнен до отправки SQL на сервер.

См. команды mysql

В действительности все разделители

Чтобы интерпретировать скрипт из C #, вам нужно написать код, который знает, что это за команда, вы не можете просто передавать команды построчно на сервер.

например. у вас есть 3 команды в этом файле и вы хотите вызывать ExecuteNonQuery только 3 раза

и из комментария парацикла вам нужно использовать класс MySqlScript

...