MySQL调用存储过程错误

时间:2017-06-23 00:34:27

标签: c# mysql sql stored-procedures mysql-routines

我真的希望有人可以帮助我。

我有一个SQL Server 2014数据库,我用它来编写我编写的桌面应用程序。在扩展之后,我想转换为MySQL以通过互联网访问数据库。

我使用MySQL WorkBench Migration Tool将所有表和数据从SQL Server复制到MySQL服务器。唯一的问题是程序不会复制,因此不得不手动修改它们。

MySQL中的过程示例:

DELIMITER $$
CREATE DEFINER=`johandre`@`%` PROCEDURE `sp_GetAllOrdersBySuburb`( IN `@SuburbID` VARCHAR(50) )
NO SQL
SELECT * from Orders  WHERE DeliverySuburb = @SuburbID$$
DELIMITER ;

服务器创建了这些过程,并且所有不使用IN输入的过程都显示了它们必须显示的内容,但是用户输入的过程会给我一个错误: 从PhpMyAdmin SQL调用时: 错误

  

SQL查询:编辑编辑

     

SET FOREIGN_KEY_CHECKS = ON;

     

MySQL说:文档

     

2014 - 命令不同步;你现在不能运行这个命令

当我在C#Winforms App中运行该程序时,它只返回一个空的结果集。

我用来调用程序的代码:

SET @p0='1'; CALL `sp_GetAllOrdersBySuburb`(@p0);

当我在过程中将代码作为普通SQL查询运行时,它也会按预期返回数据。

我希望这是足够的信息,并希望这不是一个重复的问题,但我确实环顾四周,仍然没有找到任何帮助。

谢谢

1 个答案:

答案 0 :(得分:0)

我认为,在定义过程时,您的问题可能是您的分隔符。 此外,当使用反引号来定义你的参数时(否则@不允许),你在访问参数时也需要它们:

DELIMITER $$ /* make $$ the delimiter for actually executing something */

CREATE DEFINER=`johandre`@`%` PROCEDURE `sp_GetAllOrdersBySuburb`( IN `@SuburbID` VARCHAR(50) )
NO SQL
SELECT * from Orders  WHERE DeliverySuburb = `@SuburbID`; /* normal ; here, you just define your proc */

$$ /* now execute the definition */

DELIMITER ; /* reset the delimiter */

对于分隔符:

您更改了分隔符,因为您不希望您的过程中的任何;被解释为执行分隔符,而是成为您的过程的一部分。之后,您想要执行整个定义,然后重置分隔符。

参数中的@

@是用于访问全局变量的保留字符 。如果你真的想在你的参数中使用@,你需要反引号才能使它工作。反引号允许您使用空格,保留字甚至是奇怪的字符或者在常规语法中具有特殊含义的字符,并且不允许在标识符中使用,否则无论如何都要在标识符中使用。但是,您必须使用反引号进行正确的解除引用。

`@identifier`

@identifier

解决不同的事情。这意味着,你需要

SELECT * from Orders  WHERE DeliverySuburb = `@SuburbID`;

而不是

 SELECT * from Orders  WHERE DeliverySuburb = @SuburbID;