6

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

一个.sql文件基本如下:

DROP PROCEDURE IF EXISTS myProc;

DELIMITER $$

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

DELIMITER ;

CALL myProc();

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

但是,如果我将字符串放入 myIDbCommand并执行它...

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# 运行它时,它失败了?当然,第二个问题是我应该如何解决它。

4

3 回答 3

9

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

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();
}  
于 2015-02-14T09:09:05.910 回答
2

我认为您正在寻找的是:“错误 #46429:在 MySql.Data.MySqlClient.MySqlScript 中使用 DELIMITER 命令”

于 2009-08-24T20:59:45.760 回答
0

在将 SQL 发送到服务器之前,脚本中的某些命令会被 mysqlk 客户端可执行文件解释。

查看mysql 命令

实际上所有的分隔符

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

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

并且根据 paracycle 的评论,您需要使用 MySqlScript 类

于 2009-08-24T21:00:13.390 回答