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

时间:2018-05-30 11:43:28

标签: c# mysql

我有一个我想要删除的存储过程,然后想要重新创建它。它是从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(storedProcedureSqlQuery, 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 @ %程序`AccountGetAccountOpeningClosi'

我为一个例子创建了一个应用程序: Demo stored procedure

2 个答案:

答案 0 :(得分:1)

如果要从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();

答案 1 :(得分:0)

看起来你正试图让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;