#region script helper private bool ExecuteScriptFile(string pathToScriptFile, out string errorMsg) { StreamReader reader = null; DbConnection connection = null; string strSql; string applicationPath = Request.ApplicationPath; using (reader = new StreamReader(pathToScriptFile)) { using (connection = new MySqlConnection(GetConnectionString())) { DbCommand dbCmd = connection.CreateCommand(); dbCmd.Connection = connection; dbCmd.CommandType = CommandType.Text; dbCmd.CommandTimeout = 360; // 考慮到安裝腳本可能比較大,將命令超時時間設為6分鍾 connection.Open(); while (!reader.EndOfStream) { try { strSql = NextSqlFromStream(reader); if (!string.IsNullOrEmpty(strSql)) { dbCmd.CommandText = strSql.Replace("$VirsualPath$", applicationPath); dbCmd.ExecuteNonQuery(); } } catch (Exception ex) { throw new Exception(ex.Message); } } connection.Close(); } reader.Close(); } errorMsg = null; return true; } private static string NextSqlFromStream(StreamReader reader) { StringBuilder sb = new StringBuilder(); string lineOfText = reader.ReadLine().Trim(); while (!reader.EndOfStream && string.Compare(lineOfText, "GO", true, CultureInfo.InvariantCulture) != 0) { sb.Append(lineOfText + Environment.NewLine); lineOfText = reader.ReadLine(); } // 如果最后一句不是GO,添加最后一句 if (string.Compare(lineOfText, "GO", true, CultureInfo.InvariantCulture) != 0) sb.Append(lineOfText + Environment.NewLine); return sb.ToString(); } #endregion
/// <summary> /// 執行Sql文件 /// </summary> /// <param name="varFileName">sql文件</param> /// <param name="Conn">連接字符串</param> /// <returns></returns> private bool ExecuteSqlFile(string varFileName, String Conn) { using (StreamReader reader = new StreamReader(varFileName, System.Text.Encoding.GetEncoding("utf-8"))) { MySqlCommand command; MySqlConnection Connection = new MySqlConnection(Conn); Connection.Open(); try { string line = ""; string l; while (true) { // 如果line被使用,則設為空 if (line.EndsWith(";")) line = ""; l = reader.ReadLine(); // 如果到了最后一行,則退出循環 if (l == null) break; // 去除空格 l = l.TrimEnd(); // 如果是空行,則跳出循環 if (l == "") continue; // 如果是注釋,則跳出循環 if (l.StartsWith("--")) continue; // 行數加1 line += l; // 如果不是完整的一條語句,則繼續讀取 if (!line.EndsWith(";")) continue; if (line.StartsWith("/*!")) { continue; } //執行當前行 command = new MySqlCommand(line, Connection); command.ExecuteNonQuery(); } } finally { Connection.Close(); } } return true; }
以上兩種方法通過測試都可以實現。
第一種:先整個讀取mysql腳本,同時執行多個創建
第二種:通過循環,先導入一個表結構及數據后再導入另一個(一個一個獲取)