2015-05-07 63 views
0

MySQL的程序,我創建一個C#程序讀取一個文件.sql並自動執行它。問題在於,.sql文件應該是一個過程。我創建了20多個程序。當我的.sql文件中只有一個程序時,我可以成功執行它。我將如何結合一個.sql文件中的所有程序?我嘗試了以下內容:組合兩個或更多的一條SQL文件

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateSettledMemo`(res_id varchar(45)) 
BEGIN 
UPDATE memo_reservation SET reservation_memostat = 'SETTLED' WHERE 
reservation_id = res_id; 
END$$ 

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateUnsettledMemo`(res_id varchar(45)) 
BEGIN 
UPDATE memo_reservation SET reservation_memostat = 'UNSETTLED' WHERE 
reservation_id = res_id; 
END$$ 

但是沒有創建任何東西。它返回的唯一錯誤是在MySql.Data.dll中發生未處理的「MySql.Data.MySqlClient.MySqlException」類型異常。 --後命令執行過程中遇到致命錯誤解決,這將是使用在.sql文件本身的分隔符的

+0

你會得到什麼樣的錯誤? – zedfoxus

+0

*「不起作用」*不能很好地描述您觀察到的實際行爲。它會返回一個錯誤嗎?第一個程序是否被創建,但不是其他程序?關於c#程序如何執行文件內容的信息很少。這是否調用mysql命令行客戶端,作爲外部可執行文件? 「不起作用」是對問題描述的反感。 – spencer7593

+0

你可能想問自己一個問題,「我真的需要從.sql文件讀取嗎?」我這樣說的原因是因爲用SqlCommand和SqlParameters編程實現這樣做會更好。 – waltmagic

回答

0

.sql文件中,在每個過程開始時刪除DELIMITER $$。另外,在每個過程結束後用END後面的分號(;)替換$$。您的.sql文件中查詢應該是:顯示

CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateSettledMemo`(res_id varchar(45)) 
BEGIN 
UPDATE memo_reservation SET reservation_memostat = 'SETTLED' WHERE 
reservation_id = res_id; 
END; 

CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateUnsettledMemo`(res_id varchar(45)) 
BEGIN 
UPDATE memo_reservation SET reservation_memostat = 'UNSETTLED' WHERE 
reservation_id = res_id; 
END; 

致命錯誤,當您使用變量,而不讓其您的連接內。 MySQL看到@data並希望找到一個名爲@data的參數。當它沒有找到它時會引發異常。

修復此問題將allow user variables=true添加到您的連接字符串。

0

的方法之一,但擁有它,讓MySQL將忽略它作爲評論。
舉例來說,如果你的分隔符是<NewQuery>,只寫在文件.sql-- <NewQuery>
在您的c#程序中,您可以將.sql文件除以-- <NewQuery>定界符,並單獨運行每個段。