2017-07-28 195 views
2

我想在C#中創建一個mysql函數。我這樣做的原因是因爲我想遍歷多個mysql數據庫並在每個數據庫中創建函數。如何在C#中創建MySql函數?

問題是MySqlCommand不喜歡創建函數所需的DELIMITER語法。下面的腳本執行MySQL客戶罰款,但在這種情況下不工作:

DELIMITER // 
DROP FUNCTION IF EXISTS cleandate // 
CREATE FUNCTION cleandate(mydate DATE) 
RETURNS DATE 
READS SQL DATA 

BEGIN 
RETURN (CASE WHEN mydate <= '1900-01-01' THEN '1900-01-01' WHEN mydate = '0000-00-00' THEN '1900-01-01' 
     WHEN DATE_FORMAT(mydate, '%Y') = '0000' THEN '1900-01-01' 
     WHEN DATE_FORMAT(mydate, '%m') = '00' THEN '1900-01-01' 
     WHEN DATE_FORMAT(mydate, '%d') = '00' THEN '1900-01-01' 
     ELSE mydate 
     END); 
END// 

C#代碼試圖實現這個(假設connstrings是一個字符串列表):

foreach(var connstring in connstrings) 
{ 
    // Create connection to database 
    MySql.Data.MySqlClient.MySqlConnection dbConn = new MySql.Data.MySqlClient.MySqlConnection(connstring); 

    MySqlCommand cmd = dbConn.CreateCommand(); 
    cmd.CommandText = @"[same script here]"; 

    try 
    { 
     dbConn.Open(); 
     cmd.ExecuteNonQuery(); 
    } 
    catch (Exception erro) 
    { 
     Console.WriteLine(erro.ToString());      
    } 
} 

我得到當我運行這個時,「DELIMITER附近的語法錯誤」。任何想法我可以如何實現這一目標?

+0

通常,您不必在代碼中創建SQL函數。用手工定義它們並在你的代碼中使用它們 –

+0

我幾年前用一個ODBC連接(在VBA中)嘗試過一點成功;但我不記得細節。你的例子突出的一點是,你試圖在一次調用中執行多個語句;大多數數據庫API不允許在連接上至少設置一些附加選項(如果有的話)。 _(編輯:它是通過ODBC ADODB,並不需要'DELIMITER'覆蓋。)_ – Uueerdo

回答

3

MySQL Connector提供了一個MySqlScript類,可以在處理執行多個語句和設置分隔符時用來代替MySqlCommand。

適合您的例子:

foreach(var connstring in connstrings) 
{ 
    MySqlConnection dbConn = new MySqlConnection(connstring); 

    try 
    { 
     dbConn.Open(); 

     MySqlScript script = new MySqlScript(dbConn); 

     script.Query = @"[same script here]"; 
     script.Delimiter = @"//"; 
     script.Execute(); 
    } 
    catch (Exception error) 
    { 
     Console.WriteLine(error.ToString());      
    } 
} 

https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-mysqlscript.html

+0

不能相信我不知道MySqlScript類。這對我有用!謝謝! – AS7K

+0

我也發現你實際上可以在沒有分隔符的情況下執行它......對我來說這並不明顯,因爲我在閱讀你創建函數時必須使用分隔符。哦,現在我們知道如果需要的話你可以做兩個。 – AS7K