本教程将教会您如何使用MySqlScript
类。该类使您能够执行一系列语句。根据具体情况,这可能比使用MySqlCommand
的方法。
有关“MySqlScript
类可以在MySQL Connector/NET提供的参考文档中找到。10bet官方网站
方法设置一个简单的测试数据库和表,以运行本教程中的示例程序mysql命令行客户端或MySQL工作台。命令的mysql命令行客户端如下:
创建数据库TestDB;使用TestDB;创建表TestTable (id INT NOT NULL主键AUTO_INCREMENT,名称VARCHAR(100))
主要的方法是MySqlScript
类是执行
方法。方法将脚本(语句序列)赋值给查询要执行的MySqlScript对象属性。的查询属性可以通过MySqlScript
构造函数或使用查询财产。执行
返回执行的语句数。
的MySqlScript
对象将在连接集中执行指定的脚本连接财产。同样,可以直接设置此属性或通过MySqlScript
构造函数。下面的代码片段说明了这一点:
sql = "SELECT * FROM TestTable";...MySqlScript脚本= new MySqlScript(conn, sql);...MySqlScript脚本= new MySqlScript();脚本。查询= sql; script.Connection = conn; ... script.Execute();
MySqlScript类有几个与之关联的事件。有:
如果发生错误,则生成错误。
ScriptCompleted -当脚本成功完成执行时生成。
StatementExecuted—在每个语句执行后生成。
可以将事件处理程序分配给这些事件中的每个。当连接的事件发生时,将回调这些用户提供的例程。下面的代码显示了如何设置事件处理程序。
脚本。Error += new MySqlScriptErrorEventHandler(script_Error);脚本。ScriptCompleted += new EventHandler(script_ScriptCompleted);脚本。StatementExecuted += new MySqlStatementExecutedEventHandler(script_StatementExecuted);
在VisualStudio中,您可以通过使用制表符补全来填写存根例程来节省输入。例如,从输入开始,”脚本。误差+ =”.然后按选项卡,然后按选项卡一次。分配完成,并创建了存根事件处理程序。下面是一个完整的工作示例:
使用系统;使用System.Collections.Generic;使用来;使用text;使用System.Data;使用MySql.Data;使用MySql.Data.MySqlClient;命名空间MySqlScriptTest {class Program {static void Main(string[] args) {string connStr = "server=localhost;user=root;database=TestDB;port=3306;password=******";MySqlConnection conn = new MySqlConnection(connStr);尝试{控制台。WriteLine("Connecting to MySQL..."); conn.Open(); string sql = "INSERT INTO TestTable(name) VALUES ('Superman');" + "INSERT INTO TestTable(name) VALUES ('Batman');" + "INSERT INTO TestTable(name) VALUES ('Wolverine');" + "INSERT INTO TestTable(name) VALUES ('Storm');"; MySqlScript script = new MySqlScript(conn, sql); script.Error += new MySqlScriptErrorEventHandler(script_Error); script.ScriptCompleted += new EventHandler(script_ScriptCompleted); script.StatementExecuted += new MySqlStatementExecutedEventHandler(script_StatementExecuted); int count = script.Execute(); Console.WriteLine("Executed " + count + " statement(s)."); Console.WriteLine("Delimiter: " + script.Delimiter); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } conn.Close(); Console.WriteLine("Done."); } static void script_StatementExecuted(object sender, MySqlScriptEventArgs args) { Console.WriteLine("script_StatementExecuted"); } static void script_ScriptCompleted(object sender, EventArgs e) { /// EventArgs e will be EventArgs.Empty for this method Console.WriteLine("script_ScriptCompleted!"); } static void script_Error(Object sender, MySqlScriptErrorEventArgs args) { Console.WriteLine("script_Error: " + args.Exception.ToString()); } } }
在script_ScriptCompleted
事件处理程序,EventArgs
参数e
将EventArgs。空
.在这种情况下ScriptCompleted
事件中没有需要获取的额外数据,这就是事件对象为的原因EventArgs。空
.
根据脚本的性质,您可能需要控制用于分隔组成脚本的语句的分隔符。最常见的例子是将多语句存储例程作为脚本的一部分。在本例中,如果默认分隔符为”;”,则在尝试执行该脚本时将得到错误。例如,考虑以下存储例程:
SELECT name FROM TestTableSELECT COUNT(name) FROM TestTable结束
这个例程实际上需要在MySQL服务器上作为一条语句执行。但是,使用默认分隔符”;”,MySqlScript
Class会将上面的语句解释为两个语句,第一个语句是:
SELECT name FROM TestTable
将其作为语句执行将会产生错误。要解决这个问题MySqlScript
支持设置不同的分隔符。这是通过分隔符财产。例如,您可以将分隔符设置为”??”,在这种情况下,上述存储的例程在执行时将不再生成错误。脚本中可以分隔多个语句,例如,你可以有一个三个语句的脚本,如:
"DROP PROCEDURE IF EXISTS test_routine??"+ "CREATE PROCEDURE test_routine()+ "BEGIN " + "SELECT name FROM TestTable;"+ "SELECT COUNT(name) FROM TestTable;"+“结束? ?”+”调用test_routine()”;
方法可以在任何位置将分隔符更改回来分隔符财产。下面的代码显示了一个完整的工作示例:
使用系统;使用System.Collections.Generic;使用来;使用text;使用MySql.Data;使用MySql.Data.MySqlClient;命名空间ConsoleApplication8 {class程序{static void Main(string[] args) {string connStr = "server=localhost;user=root;database=TestDB;port=3306;password=******";MySqlConnection conn = new MySqlConnection(connStr);尝试{控制台。WriteLine(“连接到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."); } } }