使用C#执行MySQL的SQL文件

最近的一个项目,需要在初始化时建库及建表,因为建表的SQL语句是从MySQL中导出的,所以在建库之后,需要执行导出的Sql语句实现建表及插入数据。方法如下:

[csharp] view plain copy

  1. /// <summary> 
  2. /// 执行Sql文件 
  3. /// </summary> 
  4. /// <param name=”varFileName”>sql文件</param> 
  5. /// <param name=”Conn”>连接字符串</param> 
  6. /// <returns></returns> 
  7. private bool ExecuteSqlFile(string varFileName, String Conn)
  8. {
  9.     using (StreamReader reader = new StreamReader(varFileName, System.Text.Encoding.GetEncoding(“utf-8”)))
  10.     {
  11.         MySqlCommand command;
  12.         MySqlConnection Connection = new MySqlConnection(Conn);
  13.         Connection.Open();
  14.         try
  15.         {
  16.             string line = “”;
  17.             string l;
  18.             while (true)
  19.             {
  20.                 // 如果line被使用,则设为空
  21.                 if (line.EndsWith(“;”))
  22.                     line = “”;
  23.                 l = reader.ReadLine();
  24.                 // 如果到了最后一行,则退出循环
  25.                 if (l == nullbreak;
  26.                 // 去除空格
  27.                 l = l.TrimEnd();
  28.                 // 如果是空行,则跳出循环
  29.                 if (l == “”continue;
  30.                 // 如果是注释,则跳出循环
  31.                 if (l.StartsWith(“–“)) continue;
  32.                 // 行数加1 
  33.                 line += l;
  34.                 // 如果不是完整的一条语句,则继续读取
  35.                 if (!line.EndsWith(“;”)) continue;
  36.                 if (line.StartsWith(“/*!”))
  37.                 {
  38.                     continue;
  39.                 }
  40.                 //执行当前行
  41.                 command = new MySqlCommand(line, Connection);
  42.                 command.ExecuteNonQuery();
  43.             }
  44.         }
  45.         finally
  46.         {
  47.             Connection.Close();
  48.         }
  49.     }
  50.     return true;
  51. }
查看评论
5楼 chengjun163 2012-11-22 09:42发表 [回复]
weikai20007你那边可以执行成功吗?
Re: weikai20007 2012-12-06 19:31发表 [回复]
回复chengjun163:已经解决,链接:

http://www.cnblogs.com/easy5weikai/archive/2012/12/06/2805558.html

Re: 骏爷在此 2015-11-17 14:56发表 [回复]
回复weikai20007:这个方法遇到异常就停止执行了
Re: weikai20007 2012-12-06 13:10发表 [回复]
回复chengjun163:可以执行,我只是在楼主的基础上处理了DELIMITER,没处理其它特殊字符。
// 如果是空行,则跳出循环
if (temp == “” || temp == cmdEndFlag) continue;
// 如果是注释,则跳出循环
if (temp.StartsWith(“–“)) continue;

// 行数加1
lineToExecute += temp;
// 如果不是完整的一条语句,则继续读取
if (!lineToExecute.EndsWith(cmdEndFlag)) continue;//(!lineToExecute.EndsWith(“;”)) continue;
if (lineToExecute.StartsWith(“/*!”))
{
continue;
}

//执行当前行
command = new MySqlCommand(lineToExecute, Connection);
command.ExecuteNonQuery();
}
}
finally
{
Connection.Close();
}
}

return true;
}
}

// 如果line被使用,则设为空
if (lineToExecute.EndsWith(cmdEndFlag))//(lineToExecute.EndsWith(“;”))
lineToExecute = “”;

temp = reader.ReadLine();

if (temp != null && temp.Contains(“DELIMITER”))
{
temp = temp.Replace(“DELIMITER”,” “);
temp = temp.Trim();

cmdEndFlag = temp;
}

// 如果到了最后一行,则退出循环
if (temp == null) break;
// 去除空格
temp = temp.TrimEnd();

/// <summary>
/// 执行Sql文件
/// </summary>
/// <param name=”varFileName”>sql文件</param>
/// <param name=”Conn”>连接字符串</param>
/// <returns></returns>
public bool ExecuteSqlFile(string varFileName, String Conn)
{
//没处理lineToExecute.Contains(“DELIMITER ;;”)
string cmdEndFlag = “;”;

using (StreamReader reader = new StreamReader(varFileName, System.Text.Encoding.GetEncoding(“utf-8”)))
{
MySqlCommand command;
MySqlConnection Connection = new MySqlConnection(Conn);
Connection.Open();
try
{

楼主,你没有考虑脚本文件中存在 DELIMITER 的特殊情况,在此斗胆班门弄斧下,在你的基础上修改了下,借花献佛。

发表评论