gpt4 book ai didi

c# - MySQL调用存储过程错误

转载 作者:行者123 更新时间:2023-11-29 18:45:05 26 4
gpt4 key购买 nike

我真的希望有人能帮助我。

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

我使用MySQL WorkBench迁移工具将所有表和数据从SQL Server复制到MySQL Server。唯一的问题是程序无法复制,所以必须手动修改它们。

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 query: Edit Edit

SET FOREIGN_KEY_CHECKS = ON;

MySQL said: Documentation

2014 - Commands out of sync; you can't run this command now

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

我用来调用该过程的代码:

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

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

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

谢谢

最佳答案

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

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;

关于c# - MySQL调用存储过程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44711309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com