使用 C# 在 MySQL 中创建存储过程

Posted

技术标签:

【中文标题】使用 C# 在 MySQL 中创建存储过程【英文标题】:Creating a Stored Procedure in MySQL with C# 【发布时间】:2013-08-10 21:00:17 【问题描述】:

我正在尝试使用以下代码以编程方式创建一个新的存储过程:

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

并将以下文本作为从 Mysql 工作台复制的创建语句:

static string query = @"
delimiter $$

CREATE PROCEDURE `GetParentIds`(IN `tempTableName` VARCHAR(255), IN `id` int)
BEGIN
DECLARE parId INT;
DECLARE curId INT;

  DROP TEMPORARY TABLE IF EXISTS tempTableName;

  CREATE TEMPORARY TABLE tempTableName (
node_id INT NOT NULL PRIMARY KEY
   );

 set curId := id;
 get_parents_loop: LOOP
     set parId := null;

     set parId = (select ParentID from TableName where ID = curId);

    IF parId is NULL THEN
       LEAVE get_parents_loop;
    END IF;

    INSERT INTO tempTableName(node_id) Values (parId);
    set curId := parId;

END LOOP get_parents_loop;
  SELECT *
     FROM tempTableName;
END$$";

这个过程被传递了一个对象的 ID,它有一个 parentID,它获取给定对象的所有父对象的所有 parentID 并返回它们。当我尝试运行它并收到以下消息时出现问题: “您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以在 'delimiter $$

附近使用正确的语法

创建过程GetParentIds(IN tempTableName VARCHAR(255),' at line 1"

欢迎提出任何想法!

* 编辑 ** 感谢以下所有答案,这终于奏效了:

CREATE PROCEDURE GetParentIds(IN tempTableName VARCHAR(255), IN id int)
BEGIN
DECLARE parId INT;
DECLARE curId INT;

DROP TEMPORARY TABLE IF EXISTS tempTableName;

 CREATE TEMPORARY TABLE tempTableName (node_id INT NOT NULL PRIMARY KEY  );

set curId := id;
get_parents_loop: LOOP
    set parId := null;

    set parId = (select ParentID from TDOs where TDOID = curId);

    IF parId is NULL THEN
       LEAVE get_parents_loop;
    END IF;

    INSERT INTO tempTableName(node_id) Values (parId);
    set curId := parId;

END LOOP get_parents_loop;
  SELECT *
    FROM tempTableName;
END;

【问题讨论】:

尝试删除过程和参数名称周围的反引号(反引号)。在您的上下文中不需要它们,并且我在字符串中的行为不端可能会被驱动程序误解 【参考方案1】:

删除开头的DELIMITER $$和最后一个END之后的$$

DELIMITER 是一个 mysql 客户端命令,可让您在定义存储例程时临时更改其语句终止符。

如果您从不使用分号作为语句终止符的编程接口中定义存储例程,则存储例程定义中的分号不会出现任何特殊问题。

【讨论】:

很好的信息,我没有意识到这没有必要! 非常感谢@peterm

以上是关于使用 C# 在 MySQL 中创建存储过程的主要内容,如果未能解决你的问题,请参考以下文章

021MySQL变量的使用,在MySQL中创建存储过程,并添加变量

在 MySQL 存储过程中创建临时表

mysql - 在存储过程中创建事件

如何在mysql中创建存储过程

无法在 Azure mySQL 中创建函数/存储过程

在 MySQL/MariaDB 中创建存储过程时出错