使用c#应用程序运行MySQL DDL命令

本文关键字:DDL 命令 MySQL 运行 应用程序 使用 | 更新日期: 2023-09-27 18:15:19

我使用MySQL数据库与c#开发一个应用程序。使用MySQL Server 5.0和odbc连接器。在某些情况下,我需要执行ddl命令(如ALTER TABLECREATE TABLE)来操作数据库。在执行命令前,需要使用IF EXISTS命令检查数据库。我写了下面的命令,在Navicat或Workbench中执行没有任何问题,但是当通过ExecuteNoneQury方法将这些命令与应用程序一起发送时不工作。

怎么了?

use db;
drop procedure if exists  sp_update ;
delimiter //
create procedure sp_update()
begin
     if not exists( SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tab' AND COLUMN_NAME = 'col' and table_schema = 'db') then
       ALTER TABLE `tab` ADD COLUMN `col`  int(11) NULL DEFAULT NULL ;
    end if;
end//
delimiter ;
call sp_update();
drop procedure if exists  sp_update ;
c#命令:
public override int ExecuteNoneQuery(string commandText)
    {
        int obTemp = 0;
        Conn = new MySqlConnection(Connection.ConnectionString);
        try
        {
            MySqlCommand MySqlCommand = new MySqlCommand(commandText, Conn);
            if (Conn.State == ConnectionState.Closed)
            {
                Conn.Open();
            }
            obTemp = MySqlCommand.ExecuteNonQuery();
        }
        finally
        {
            if (Conn.State == ConnectionState.Open)
            {
                Conn.Close();
            }
        }
        return obTemp;
    }

使用c#应用程序运行MySQL DDL命令

"delimiter"不是MySQL语法。对于mysql命令行客户端来说,这是一个方便的功能,只有它才能理解(好吧,一些GUI客户端也模仿了这种行为,以便能够运行最初认为是命令行客户端的脚本)。

但是,在连接器执行的任何代码中都不需要"分隔符"。使用它会导致语法错误,就像你得到的那样。

我自己解决了问题。我需要把我的sql命令分成两个部分。

第1部分创建过程:

drop procedure if exists  sp_update ;
create procedure sp_update()
begin
     if not exists( SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tab' AND COLUMN_NAME = 'col' and table_schema = 'db') then
       ALTER TABLE `tab` ADD COLUMN `col`  int(11) NULL DEFAULT NULL ;
    end if;
end

第2部分:

call sp_update();
drop procedure if exists  sp_update ;