2011-11-20 80 views
3

我使用MySQL数据库与C#开发应用程序。使用MySQL Server 5.0和odbc连接器。 在某些情况下,我需要执行ddl命令(如ALTER TABLECREATE 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; 
    } 
+5

请发布您的ADO.NET代码。 – Oded

+0

你得到的错误是什么? – Henrik

+0

错误是:您的SQL语法有错误;检查对应于你的MySQL服务器版本正确的语法使用附近的手册“分隔符// 创建过程sp_update() 开始 \t如果不存在(选择”在行1 –

回答

3

“delimiter”不是MySQL语法。它对于mysql命令行客户端来说是一个便利的功能,并且只能被它理解(当然,某些GUI客户端也会模仿这种行为,以便能够运行原本是思考命令行客户端)。

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

+0

非常感谢你。救了我很多时间和神经。 –

1

我解决我自己的问题。我需要将我的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分开。

相关问题