存储过程适用于Mysql工作台,但不适用于C#代码

我有一个存储过程,我想删除,然后想重新创建它。 它是从Mysql工作台开始工作但不是从c#代码开始工作。

我正在使用MySql Workbench 6.3 CE

这是存储过程的干运行:

DROP PROCEDURE IF EXISTS AccountGetAccountOpeningClosingStock; DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE `AccountGetAccountOpeningClosingStock`(IN _endDate datetime) BEGIN Select * From openingclosingstock Where CreateDate <= _endDate order by CreateDate asc; END$$ DELIMITER ; 

这是来自C#代码的调用:

 string myConnectionString = FetchDbConnectionString(environment, item); MySqlConnection mySqlConnection = new MySqlConnection(myConnectionString); MySqlCommand mySqlCommand = new MySqlCommand(storeProcedureSqlQuery, mySqlConnection); await mySqlConnection.OpenAsync(); var reader = await mySqlCommand.ExecuteReaderAsync(); while (await reader.ReadAsync()) { //do something } reader.Close(); await mySqlConnection.CloseAsync(); 

来自c#代码的错误:

 您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在'DELIMITER $$附近使用正确的语法
在第1行创建DEFINER =`root` @`%`PROCEDURE`AccountGetAccountOpeningClosi' 

我为示例创建了一个应用程序: Demo Stored Procedure

如果要从C#代码创建存储过程,则可以使用下面的代码

 string myConnectionString = FetchDbConnectionString(environment, item); MySqlConnection mySqlConnection = new MySqlConnection(myConnectionString); const string sqlQuery ="DELIMITER $$ DELIMITER $$ DROP PROCEDURE IF EXISTS AccountGetAccountOpeningClosingStock; $$ CREATE PROCEDURE AccountGetAccountOpeningClosingStock(IN _endDate datetime) BEGIN Select * From tutorials_tbl Where CreateDate <= _endDate order by CreateDate asc; END$$ $$ DELIMITER; DELIMITER;"; MySqlScript script = new MySqlScript(); script.Connection = mySqlConnection; script.Query = sqlQuery; script.Execute(); mySqlConnection.Close(); 

看起来你正试图让proc重新创建并同时运行。 这应该可以获得您正在寻找的数据,或者在SQL中调用该过程来获取数据。 如果您正在尝试重新创建(测试它是否存在),请在需要数据之前在程序的单独部分中执行此操作。

 string myConnectionString = FetchDbConnectionString(environment, item); MySqlConnection mySqlConnection = new MySqlConnection(myConnectionString); string SQLC= "Select * From openingclosingstock Where CreateDate <= _endDate order by CreateDate asc;" MySqlCommand mySqlCommand = new MySqlCommand(SQLC, mySqlConnection); await mySqlConnection.OpenAsync(); var reader = await mySqlCommand.ExecuteReaderAsync(); while (await reader.ReadAsync()) { //do something } reader.Close(); await mySqlConnection.CloseAsync(); 

或者您是否在此创建生产者以便稍后调用它?

删除开头的DELIMITER $$和最后一个END后的$$

DELIMITER是一个MySQL客户端命令,使您可以在定义存储例程时临时更改其语句终止符。

如果要在不使用分号作为语句终止符的编程接口中定义存储例程,则存储例程定义中的分号不会出现任何特殊问题。

不知道该代码是否有效。 也许试试这个:

 using (MySqlConnection conn = new MySqlConnection(connectionString)) { conn.Open(); using (MySqlTransaction trans = conn.BeginTransaction()) { using (MySqlCommand command = conn.CreateCommand()) { command.CommandText = query; command.ExecuteNonQuery(); } trans.Commit(); } } 

和SQL:

 DROP PROCEDURE IF EXISTS AccountGetAccountOpeningClosingStock; CREATE PROCEDURE AccountGetAccountOpeningClosingStock(IN endDate datetime) BEGIN Select * From openingclosingstock Where CreateDate <= endDate order by CreateDate; END;