繁体   English   中英

C#,MySQL,ADO.NET,分隔符导致语法错误

[英]C#, MySQL, ADO.NET, delimiter causing syntax error

我有C#代码循环.sql文件并执行其中的内容来设置数据库。

一个.sql文件基本如下:

DROP PROCEDURE IF EXISTS myProc;

DELIMITER $$

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

DELIMITER ;

CALL myProc();

当我将它输入到MySQL查询浏览器的脚本窗口时,它会一遍又一遍地运行,就像人们希望的那样。

但是,如果我将字符串放入我的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服务器版本对应的手册,以便在'DELIMITER $$ CREATE PROCEDURE myProc()BEGIN附近使用正确的语法...

所以,问题是......为什么MySQL让我这样做没有问题,但是当我尝试从C#运行它时,它失败了? 当然第二个问题是我应该如何修复它。

对于那些寻找快速片段的人......

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();
}  

在将SQL发送到服务器之前,脚本中的某些命令将被解释为mysqlk客户端可删除。

请参阅mysql命令

实际上所有的分隔符

要从C#解释脚本,您必须编写知道命令是什么的代码,您不能只是逐行将命令传递给服务器。

例如,你在该文件中有3个命令,因此只想调用ExecuteNonQuery 3次

从paracycle的coment你需要使用MySqlScript类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM