2009-08-24 27 views
6

我有C#代碼循環訪問.sql文件並執行其中的內容來設置數據庫。C#,MySQL,ADO.NET,引起語法錯誤的分隔符

一個.sql文件基本如下:

DROP PROCEDURE IF EXISTS myProc; 

DELIMITER $$ 

CREATE PROCEDURE myProc() 
BEGIN 
-- procedure stuff goes here 
END $$ 

DELIMITER ; 

CALL myProc(); 

當我輸入到這個MySQL查詢瀏覽器的腳本窗口,它運行完美......一遍又一遍,就像一個希望它。

但是,如果我把字符串轉換成我IDbCommand並執行它...

connection.Open(); // An IDbConnection 
IDbTransaction transaction = connection.BeginTransaction(); 
using (IDbCommand cmd = connection.CreateCommand()) 
{ 
    cmd.Connection = connection; 
    cmd.Transaction = transaction; 
    cmd.CommandText = line; 
    cmd.CommandType = CommandType.Text; 

    try 
    { 
     cmd.ExecuteNonQuery(); 
    } 
    catch (SqlException ex) 
    { 
     transaction.Rollback(); 
     return false; 
    } 
} 

transaction.Commit(); 
connection.Close(); 

...我得到了可怕的例外,1064 ...

你有一個錯誤你的SQL語法;檢查 對應於你的MySQL服務器版本使用 附近「DELIMITER $$ CREATE PROCEDURE MYPROC()開始正確的語法手冊...

所以,問題是......爲什麼我們的MySQL我這樣做沒有問題,但是當我嘗試從C#運行它時,它會失敗?當然,第二個問題是我應該如何解決這個問題。

回答

0

一些腳本的命令解釋的BT客戶端mysqlk的excutable SQL被髮送到服務器之前。

mysql commands

實際上所有的分隔符

解釋從C#腳本,你將不得不寫,知道該命令是什麼代碼,你不能只是通過線通過命令行服務器。

例如你必須在該文件3個命令等想打電話給你的ExecuteNonQuery需要使用MySqlScript類

6

對於那些尋找一個快速的片段只有3次

和paracycle的COMENT ...

var connectionString = @"server=ChangeMe;user=ChangeMe;pwd=ChangeMe;database=ChangeMe;"; 

var scriptText = File.ReadAllText(@"C:\script.sql"); 

using (var connection = new MySqlConnection(connectionString)) 
{ 
    var script = new MySqlScript(connection, scriptText); 
    connection.Open(); 
    script.Execute(); 
}