根据自己的需要有选择的翻译官方文档
根据sql脚本的内容,你需要控制脚本的分隔符。一个最常见的例子是当你在存储过程中有一个多语句的过程,
使用默认的;分隔符,执行时就会报错(我就遇到了这个错误)
比如,以下的存储过程:
CREATE PROCEDURE test_routine()
BEGIN
SELECT name FROM TestTable ORDER BY name;
SELECT COUNT(name) FROM TestTable;
END
这个过程实际上执行的时候是一个语句,然而 ,如果用;分隔符,sqlscript就会认为它是两个语句,
第一个语句是
CREATE PROCEDURE test_routine()
BEGIN
SELECT name FROM TestTable ORDER BY name;
执行时会报语法错误,为了解决这个问题mysqlscript支持使用不同的分隔符通过使用delimiter属性。
比如,你可以设置delimiter为“??”,这样,上面的语句就不会报错。
以下是官网的例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace ConsoleApplication8
{
class Program
{
static void Main(string[] args)
{
string connStr = "server=localhost;user=root;database=TestDB;port=3306;password=******;";
MySqlConnection conn = new MySqlConnection(connStr);
try
{
Console.WriteLine("Connecting to MySQL...");
conn.Open();
string sql = "DROP PROCEDURE IF EXISTS test_routine??" +
"CREATE PROCEDURE test_routine() " +
"BEGIN " +
"SELECT name FROM TestTable ORDER BY name;" +
"SELECT COUNT(name) FROM TestTable;" +
"END??" +
"CALL test_routine()";
MySqlScript script = new MySqlScript(conn);
script.Query = sql;
script.Delimiter = "??";
int count = script.Execute();
Console.WriteLine("Executed " + count + " statement(s)");
script.Delimiter = ";";
Console.WriteLine("Delimiter: " + script.Delimiter);
Console.WriteLine("Query: " + script.Query);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
conn.Close();
Console.WriteLine("Done.");
}
}
}
以下是个人的理解:
当使用到mysqlscript时,可以直接在sql文件里这样写
DELIMITER ??
........
BEGIN
....
END??
DELIMITER ;
也是一种解决办法
在实际使用中sql脚本文件可能会比较长,情况复杂,具体使用时,mysqlscript可能不够灵活,需要重写,或者不用mysqlscript
自己处理文件,自己执行。因为mysqlscript遇到错误就会停止执行,没有更丰富的选项以及日志功能,所以可能还是需要自己来操作
sql文件。