【发布时间】: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;
【问题讨论】:
-
尝试删除过程和参数名称周围的反引号(反引号)。在您的上下文中不需要它们,并且我在字符串中的行为不端可能会被驱动程序误解
标签: c# mysql stored-procedures