【问题标题】:Stored Procedure works in Mysql workbench but not in C# code存储过程适用于 Mysql 工作台,但不适用于 C# 代码
【发布时间】:2018-05-30 11:43:27
【问题描述】:

我有一个存储过程,我想删除它然后重新创建它。它可以在 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@% PROCEDURE `AccountGetAccountOpeningClosi'

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

【问题讨论】:

  • storeProcedureSqlQuery确切值是多少?
  • 我附上了一个Demo项目,请查收,你会知道的。

标签: c# mysql


【解决方案1】:

您似乎正试图让 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;

【讨论】:

  • 我需要创建存储过程。正如我提到的,我想删除然后重新创建它
  • 已编辑的 Sql 查询:删除过程如果存在 AccountGetAccountOpeningClosingStock; CREATE DEFINER=root@% PROCEDURE AccountGetAccountOpeningClosingStock(IN endDate datetime) BEGIN Select * From openingclosingstock Where CreateDate 错误信息:_您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 3 行的 '' 附近使用的正确语法
  • 删除 DEFINER=root@% 看看是不是问题
  • 我检查了所有可能的情况,但它不起作用
  • 请编辑您的问题以显示您如何声明 storeProcedureSqlQuery
【解决方案2】:

我找到了一个解决方案,它运行良好。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2015-11-11
    • 2020-08-23
    • 2018-05-21
    • 2017-12-27
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多