使用c#应用程序运行MySQL DDL命令
本文关键字:DDL 命令 MySQL 运行 应用程序 使用 | 更新日期: 2023-09-27 18:15:19
我使用MySQL数据库与c#开发一个应用程序。使用MySQL Server 5.0和odbc连接器。在某些情况下,我需要执行ddl命令(如ALTER TABLE
或CREATE 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;
}
"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 ;