stevenjin 2024-08-20 16:18 采纳率: 97.3%
浏览 1
已结题

用c#拼接DELIMITER 存储过程时出错

用c#拼接如下存储过程时出错。放在mysql中,如果将sb1.Append("DELIMITER ;;");独占一行则可以,正确写法是怎样?



                    StringBuilder sb1 = new StringBuilder();
                  
                    sb1.Append($"CREATE DATABASE IF NOT EXISTS {"webui" + DateTime.Now.Year};");
                    sb1.Append("DROP PROCEDURE IF EXISTS `AddColumn`;");
                    sb1.Append("DELIMITER ;;");
                    sb1.Append("CREATE DEFINER=`root`@`localhost` PROCEDURE `AddColumn`(IN tableName VARCHAR(50), IN columnName VARCHAR(50), IN columnType VARCHAR(50))");
                    sb1.Append("BEGIN ");
                    sb1.Append("DECLARE columnExists INT DEFAULT 0;");
                    sb1.Append(" SELECT COUNT(*) INTO columnExists FROM INFORMATION_SCHEMA.COLUMNS ");
                    sb1.Append("WHERE TABLE_NAME = tableName AND COLUMN_NAME = columnName;");
                    sb1.Append(" IF columnExists = 0 THEN");
                    sb1.Append(" SET @ddl = CONCAT('ALTER TABLE ', tableName, ' ADD COLUMN ', columnName, ' ', columnType);");
                    sb1.Append("PREPARE stmt FROM @ddl;");
                    sb1.Append("EXECUTE stmt;");
                    sb1.Append("DEALLOCATE PREPARE stmt;");
                    sb1.Append("END IF;");
                    sb1.Append("END");
                    sb1.Append(";;");
                    sb1.Append("DELIMITER ;");
  • 写回答

2条回答 默认 最新

  • 清水白石008 2024-08-20 18:05
    关注
    🕒下午好,题主!目前:🟢[在线]
    📢参考GPT-4o mini 模型、由清水白石008整理提供!
    📣今日金句:“生活就像骑自行车。要保持平衡,就得不断前进。” — 阿尔伯特·爱因斯坦
    

    在 MySQL 中,DELIMITER 命令用于更改语句分隔符,以便可以定义存储过程、触发器等。DELIMITER 命令本身并不是 SQL 语句的一部分,而是 MySQL 客户端的命令。因此,在 C# 中拼接 SQL 语句时,您需要确保 DELIMITER 命令的使用是正确的。

    在 C# 中,您不能将 DELIMITER 命令放在 SQL 语句中,因为它会导致语法错误。相反,您应该在执行存储过程之前和之后分别使用 DELIMITER 命令。以下是一个正确的写法示例:

    StringBuilder sb1 = new StringBuilder();
    
    // 创建数据库
    sb1.Append($"CREATE DATABASE IF NOT EXISTS `webui{DateTime.Now.Year}`;");
    
    // 删除存储过程(如果存在)
    sb1.Append("DROP PROCEDURE IF EXISTS `AddColumn`;");
    
    // 这里不需要 DELIMITER,因为它不是 SQL 语句的一部分
    sb1.Append("CREATE DEFINER=`root`@`localhost` PROCEDURE `AddColumn`(IN tableName VARCHAR(50), IN columnName VARCHAR(50), IN columnType VARCHAR(50)) ");
    sb1.Append("BEGIN ");
    sb1.Append("DECLARE columnExists INT DEFAULT 0; ");
    sb1.Append("SELECT COUNT(*) INTO columnExists FROM INFORMATION_SCHEMA.COLUMNS ");
    sb1.Append("WHERE TABLE_NAME = tableName AND COLUMN_NAME = columnName; ");
    sb1.Append("IF columnExists = 0 THEN ");
    sb1.Append("SET @ddl = CONCAT('ALTER TABLE ', tableName, ' ADD COLUMN ', columnName, ' ', columnType); ");
    sb1.Append("PREPARE stmt FROM @ddl; ");
    sb1.Append("EXECUTE stmt; ");
    sb1.Append("DEALLOCATE PREPARE stmt; ");
    sb1.Append("END IF; ");
    sb1.Append("END; ");
    
    // 结束存储过程
    sb1.Append(";;");
    
    // 这里也不需要 DELIMITER
    

    关键点:

    1. DELIMITER 命令:在 C# 中拼接 SQL 语句时,不需要将 DELIMITER 命令包含在 SQL 语句中。DELIMITER 仅在 MySQL 客户端中使用。
    2. 结束存储过程:在存储过程的定义结束后,您可以使用 ;; 来表示结束。
    3. 执行 SQL 语句:在执行 SQL 语句时,您只需执行 sb1.ToString() 生成的 SQL 语句,而不需要处理 DELIMITER

    执行存储过程:

    在执行存储过程时,您可以使用以下代码:

    using (var connection = new MySqlConnection(connectionString))
    {
        connection.Open();
        using (var command = new MySqlCommand(sb1.ToString(), connection))
        {
            command.ExecuteNonQuery();
        }
    }
    

    确保您使用的 MySQL 数据库连接库支持执行多条 SQL 语句。如果您使用的是 MySql.Data,则可以直接执行拼接的 SQL 语句。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月12日
  • 已采纳回答 9月4日
  • 创建了问题 8月20日

悬赏问题

  • ¥15 网络分析设施点无法识别
  • ¥15 状态图的并发态问题咨询
  • ¥15 PFC3D,plot
  • ¥15 VAE模型编程报错无法解决
  • ¥100 基于SVM的信息粒化时序回归预测,有偿求解!
  • ¥15 物体组批优化问题-数学建模求解答
  • ¥15 微信原生小程序tabBar编译报错
  • ¥350 麦克风声源定位坐标不准
  • ¥15 apifox与swagger使用
  • ¥15 egg异步请求返回404的问题