2009-08-24 48 views
6

我有C#代码循环访问.sql文件并执行其中的内容来设置数据库。C#,MySQL,ADO.NET,引起语法错误的分隔符

一个.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()开始正确的语法手册...

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

回答

0

一些脚本的命令解释的BT客户端mysqlk的excutable SQL被发送到服务器之前。

mysql commands

实际上所有的分隔符

解释从C#脚本,你将不得不写,知道该命令是什么代码,你不能只是通过线通过命令行服务器。

例如你必须在该文件3个命令等想打电话给你的ExecuteNonQuery需要使用MySqlScript类

6

对于那些寻找一个快速的片段只有3次

和paracycle的COMENT ...

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