我试图从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表。
答案 0 :(得分:0)
您可以尝试使用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服务器做了一些影响所有连接的事情,或者在一个连接中做了什么事情,影响了所有连接,直到重新启动。