找了好久,在MySQL官網找到了,連接如下:
http://dev.mysql.com/doc/refman/5.5/en/connector-net-tutorials-mysqlscript.html
22.2.4.8. Tutorial: Using MySqlScript
22.2.4.8.1. Using Delimiters with MySqlScript
第一步:引用 程序集 MySql.Data.dll
第二步:應用類MySqlScript :
這是官網的代碼:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using MySql.Data; 7 using MySql.Data.MySqlClient; 8 9 namespace ConsoleApplication8 10 { 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 string connStr = "server=localhost;user=root;database=TestDB;port=3306;password=******;"; 16 MySqlConnection conn = new MySqlConnection(connStr); 17 18 try 19 { 20 Console.WriteLine("Connecting to MySQL..."); 21 conn.Open(); 22 23 string sql = "DROP PROCEDURE IF EXISTS test_routine??" + 24 "CREATE PROCEDURE test_routine() " + 25 "BEGIN " + 26 "SELECT name FROM TestTable ORDER BY name;" + 27 "SELECT COUNT(name) FROM TestTable;" + 28 "END??" + 29 "CALL test_routine()"; 30 31 MySqlScript script = new MySqlScript(conn); 32 33 script.Query = sql; 34 script.Delimiter = "??"; 35 int count = script.Execute(); 36 Console.WriteLine("Executed " + count + " statement(s)"); 37 script.Delimiter = ";"; 38 Console.WriteLine("Delimiter: " + script.Delimiter); 39 Console.WriteLine("Query: " + script.Query); 40 } 41 catch (Exception ex) 42 { 43 Console.WriteLine(ex.ToString()); 44 } 45 46 conn.Close(); 47 Console.WriteLine("Done."); 48 } 49 } 50 }
看我在官網代碼基礎上注釋掉和修改string sql的內容(以下代碼第23行,添加了:Delimiter??,
並且注釋掉了第34行和第37行//script.Delimiter = "??";我想說明的是MySqlScript類能自己
處理一些特殊情況(如:特殊字符,注釋,關鍵字Delimiter等等),MySqlScript自己會處理
好的,不用你管。不要被官網的那幾個英文繞暈了,還要自己script.Delimiter = "??";去處理特殊情況 ,看看:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using MySql.Data; 7 using MySql.Data.MySqlClient; 8 9 namespace ConsoleApplication8 10 { 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 string connStr = "server=localhost;user=root;database=TestDB;port=3306;password=******;"; 16 MySqlConnection conn = new MySqlConnection(connStr); 17 18 try 19 { 20 Console.WriteLine("Connecting to MySQL..."); 21 conn.Open(); 22 23 string sql = "Delimiter ?? DROP PROCEDURE IF EXISTS test_routine??" + 24 "CREATE PROCEDURE test_routine() " + 25 "BEGIN " + 26 "SELECT name FROM TestTable ORDER BY name;" + 27 "SELECT COUNT(name) FROM TestTable;" + 28 "END??" + 29 "CALL test_routine()"; 30 31 MySqlScript script = new MySqlScript(conn); 32 33 script.Query = sql; 34 //script.Delimiter = "??"; 35 int count = script.Execute(); 36 Console.WriteLine("Executed " + count + " statement(s)"); 37 //script.Delimiter = ";"; 38 Console.WriteLine("Delimiter: " + script.Delimiter); 39 Console.WriteLine("Query: " + script.Query); 40 } 41 catch (Exception ex) 42 { 43 Console.WriteLine(ex.ToString()); 44 } 45 46 conn.Close(); 47 Console.WriteLine("Done."); 48 } 49 } 50 }
最后,string sql可以從sql腳本文件中讀取;
1 FileInfo file = new FileInfo(filename); //filename是sql腳本文件路徑。 2 string sql = file.OpenText().ReadToEnd();
這是腳本文件:
Delimiter ?? DROP PROCEDURE IF EXISTS test_routine?? CREATE PROCEDURE test_routine() BEGIN SELECT name FROM TestTable ORDER BY name; SELECT COUNT(name) FROM TestTable; END??
Delimiter ;
CALL test_routine();
OK啦!
后記:
如果執行的腳本是創建數據庫的腳本,例如:
createDataBase.sql
-- ---------------------------- -- CREATE SCHEMA `TestDB`
-- ----------------------------
create database if not exists `TestDB`;
連接字符串中不能有數據庫的名字,否則執行腳本失敗,道理很顯然易見,在數據庫沒創建之前,根本無法通過該連接執行。
在數據庫尚未存在,需要創建數據時,創建的連接應該是:
15 string connStr = "server=localhost;user=root;database=;port=3306;password=******;"; 16 MySqlConnection conn = new MySqlConnection(connStr);
是
database=;
(即:沒有數據庫名)
而不是:
database=TestDB;