使用C#运行MySQL DDL命令应用程序
问题描述:
我使用MySQL数据库与C#开发应用程序。使用MySQL Server 5.0和odbc连接器。 在某些情况下,我需要执行ddl命令(如ALTER TABLE
或CREATE TABLE
)来操作数据库。在这些情况下,我需要在执行命令之前使用IF EXISTS
命令来检查数据库。我在Navicat或Workbench中编写下面执行没有任何问题的命令,但在通过ExecuteNoneQury
方法发送此应用程序时不起作用。使用C#运行MySQL DDL命令应用程序
有什么不对?
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客户端也会模仿这种行为,以便能够运行原本是思考命令行客户端)。
但是,在连接器执行的任何代码中不需要“分隔符”。使用它会导致语法错误,就像你得到的那样。
+0
非常感谢你。救了我很多时间和神经。 –
答
我解决我自己的问题。我需要将我的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 ;
发送每条命令到MySQL分开。
请发布您的ADO.NET代码。 – Oded
你得到的错误是什么? – Henrik
错误是:您的SQL语法有错误;检查对应于你的MySQL服务器版本正确的语法使用附近的手册“分隔符// 创建过程sp_update() 开始 \t如果不存在(选择”在行1 –