从c#,分隔符问题创建一个MySQL sproc

时间:2017-03-01 18:20:21

标签: c# mysql

我试图从c#程序创建存储过程。它通常从文本文件中读取sproc定义,然后针对所选数据库运行它。

我的SQL脚本文件如下所示:

    DROP PROCEDURE IF EXISTS MySproc;
    DELIMITER //
    CREATE PROCEDURE MySproc(           
                IN Id BIGINT,
                IN Reference VARCHAR(255),
                IN Bla VARCHAR(255)
    )
    BEGIN
                INSERT INTO TableA(`Id`, `Reference`) VALUES(Id, Reference);
                INSERT INTO TableB(`Id`, `Bla`) VALUES(Id, Bla);
    END
    //
    DELIMITER ;

这在工作台中运行良好。 然后我用这种类型的c#代码执行它:

        using (MySqlCommand sqlCommand = _mySqlConnection.CreateCommand())
        {
            sqlCommand.Connection = _mySqlConnection;
            sqlCommand.CommandText = scriptfile;
            sqlCommand.CommandType = CommandType.Text;
            sqlCommand.ExecuteNonQuery();
        }

它出错了:

  

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在DELIMITER附近使用正确的语法//   创建程序MySproc(在Id BIGINT中     '在第1行

如果我删除了DELIMITER //的东西,那么它仍然会将BEGIN和END之间的半冒号解析为外部语句的分隔符,并且它出错:

  

您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在' END'附近使用正确的语法。在第31行

我知道如何设置Command或脚本中的东西以便它可以工作吗?甚至不确定错误是否实际来自MySQL本身,或来自MySqlCommand库(MySql.Data.6.9.9)。而MySQL服务器是5.6.25,InnoDB表。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用delimiter $$

等替换DELIMITER //

答案 1 :(得分:0)

毫无意义的问题,抱歉,这很令人尴尬。今天早上,我在本页面的顶部创建了一个单元测试:https://dev.mysql.com/doc/connector-net/en/connector-net-programming-stored-using.html 它工作正常:

    [TestMethod]
    public void TestSprocCreationFromMySqlDoc()
    {
        // from https://dev.mysql.com/doc/connector-net/en/connector-net-programming-stored-using.html
        MySqlConnection conn = new MySqlConnection();
        conn.ConnectionString = "server=localhost;user=root;database=test;port=3306;password=;";
        MySqlCommand cmd = new MySqlCommand();

        try
        {
            Console.WriteLine("Connecting to MySQL...");
            conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = "DROP PROCEDURE IF EXISTS add_emp";
            cmd.ExecuteNonQuery();
            cmd.CommandText = "DROP TABLE IF EXISTS emp";
            cmd.ExecuteNonQuery();
            cmd.CommandText = "CREATE TABLE emp (empno INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(20), last_name VARCHAR(20), birthdate DATE)";
            cmd.ExecuteNonQuery();

            cmd.CommandText = "CREATE PROCEDURE add_emp(" +
                              "IN fname VARCHAR(20), IN lname VARCHAR(20), IN bday DATETIME, OUT empno INT)" +
                              "BEGIN INSERT INTO emp(first_name, last_name, birthdate) " +
                              "VALUES(fname, lname, DATE(bday)); SET empno = LAST_INSERT_ID(); END";

            cmd.ExecuteNonQuery();
        }
        finally
        {
            conn.Close();
        }
    }

然后,我用我自己的语句做了另一个测试(试图用crlf复制从磁盘读取的文件),它也有效!

            cmd.CommandText =
                "DROP PROCEDURE IF EXISTS MySproc; " + Environment.NewLine +
                "CREATE PROCEDURE MySproc(" + Environment.NewLine +
                "IN Id BIGINT," + Environment.NewLine +
                "IN Reference VARCHAR(255)," + Environment.NewLine +
                "IN Bla VARCHAR(255))" + Environment.NewLine +
                "BEGIN " + Environment.NewLine +
                "INSERT INTO TableA(`Id`, `Reference`) VALUES(Id, Reference); " + Environment.NewLine +
                "INSERT INTO TableB(`Id`, `Bla`) VALUES(Id, Bla); " + Environment.NewLine +
                "END";
            cmd.ExecuteNonQuery();

然后我运行了我的原始应用程序(从文件中读取脚本),它运行正常!所以我无法解释。我想知道我是否对MySql服务器做了一些影响所有连接的事情,或者在一个连接中做了什么事情,影响了所有连接,直到重新启动。