[英]Stored Procedure works in Mysql workbench but not in C# code
我有一个存储过程,我想删除,然后想重新创建它。 它是从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服务器版本对应的手册,以便在第1行'DELIMITER $$ CREATE DEFINER =
root
@%
PROCEDURE`AccountGetAccountOpeningClosi'附近使用正确的语法
我为一个例子创建了一个应用程序: 演示存储过程
看起来你正试图让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;
我找到了一个解决方案,它工作得很好。
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.