2014-03-27 195 views
1

我正在c#中構建一個程序,該程序從MYSQL的sql文件執行代碼。該SQL文件創建一個存儲過程,如:如何通過C#代碼在MySql中創建存儲過程

DELIMITER ** 
USE MyDB** 

DROP PROCEDURE IF EXISTS sp_msstudy_Update** 


Create Procedure XXXXXXXXXXXXXXXXX 
(
    _cad varchar(250) 
) 

Begin 
    SET @dSQL = CONCAT('ALTER TABLE ', 'mytable',' ADD createdon DATETIME DEFAULT now() NOT NULL');   
    PREPARE stmt FROM @dSQL; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt;  
End 
** 

DELIMITER ; 

我有一個讀取行的函數。 obiously在環路我設置一些這樣的代碼

line += readedline + "\n"; 

最後我執行的代碼:的MysqlCommandExecuteNonQuery。連接和一切工作,但是當我執行SQL創建存儲過程給我一個語法錯誤:

C:\PROYECTOS\DB\MySQL\97 xxxx .sql: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DROP PROCEDURE IF EXISTS sp_msstudy_Update 
Create Procedure XXXXXXXXXXXXXXXX' at line 2 

我的C#代碼來調用字符串讀取後SQL是:

MySqlConnection conn = null; 
      MySqlCommand cmd = null; 

      var connectionstring = "Server=localhost;Port=3306;Database=test;Uid=root;Pwd=root;"; 
      try 
      { 

       using (conn = new MySqlConnection(connectionstring)) 
       { 
        conn.Open(); 

        using (cmd = new MySqlCommand(mysqlsql, conn)) 
        { 
         cmd.ExecuteNonQuery(); 

        } 

        conn.Close(); 

       } 

      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
      finally 
      { 

       cmd.Dispose(); 
       conn.Close(); 
       conn.Dispose(); 
      } 

閱讀我使用的sql文件:

private string LeerFichero(string sqlfile, bool sp) 
{ 
    string res = ""; 
    string line; 
    try 
    { 
     System.IO.StreamReader file = new System.IO.StreamReader(sqlfile); 

     while ((line = file.ReadLine()) != null) 
     { 
      res += line + "\n"; 
     } 
     file.Close(); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 

    return res; 
} 

你能幫我嗎?

我改變了程序,新的錯誤給了我。我跳DROP錯誤,但現在是給我:

C:\PROYECTOS\DB\MySQL\99.sysauditoria.SP.sql: Parameter '@dSQL' must be defined. 
+0

Hi @David。如果您直接在數據庫上運行它,而不是從C#運行,這個SQL是否可以毫無問題地工作? –

+0

我知道,但我的問題是針對c#,請再次閱讀問題。我有一個serveral文件,我正在建立一個自動過程。 – David

+0

我看過這個問題。你是說它可以直接在數據庫上正常工作嗎?如果它不起作用,從C#調用它將不起作用。您還需要顯示C#代碼,而不僅僅是使用哪些命令。 –

回答

0

我發現我一直在尋找一個解決方案:

MySqlScript script = new MySqlScript(conn, query); 
script.Delimiter = "$$"; 
script.Execute(); 

哪裏查詢我將我的SQL文件作爲字符串。使用此係統創建存儲過程。

0

在我發現了一個臨時解決方案使用mysql命令使用內部命令excuted

source C:\Proyectos\DB\automat.sql

和內部的自動售貨機文件的那一刻自動售貨機我寫的所有URL來源,我需要

source C:\Proyectos\DB\sql\file_1.sql 
... 
source C:\Proyectos\DB\sql\file_n.sql 

這是最好的辦法,直到我通過C#得到一些想法,我相信它存在一些解決方案。