本节说明如何使用存储过程。将数据库密集型操作放入存储过程可以让您为数据库应用程序定义 API。您可以在多个应用程序和多种编程语言中重用此 API。这种技术避免了数据库代码重复,在您因架构更改、调整查询性能或添加用于日志记录、安全等的新数据库操作而进行更新时,可以节省时间和精力。在学习本教程之前,请熟悉用于创建不同类型存储例程的 CREATE PROCEDURE
和 CREATE FUNCTION
语句。
在本教程中,您将创建一个简单的存储过程,以了解如何从 MySQL Connector/NET 调用它。在 MySQL 客户端程序中,连接到 world
数据库并输入以下存储过程
DELIMITER //
CREATE PROCEDURE country_hos
(IN con CHAR(20))
BEGIN
SELECT Name, HeadOfState FROM Country
WHERE Continent = con;
END //
DELIMITER ;
通过在 mysql 命令解释器中键入以下内容来测试存储过程是否按预期工作
CALL country_hos('Europe');
存储例程接受一个参数,该参数是要将搜索限制到的大洲。
确认存储过程存在且正确后,您可以了解如何从 Connector/NET 访问它。
从 Connector/NET 应用程序调用存储过程类似于您在本教程前面部分中看到的技术。将创建一个 MySqlCommand
对象,但它不接受 SQL 查询作为参数,而是接受要调用的存储过程的名称。将 MySqlCommand
对象设置为存储过程的类型,如下面的代码片段所示
string rtn = "country_hos";
MySqlCommand cmd = new MySqlCommand(rtn, conn);
cmd.CommandType = CommandType.StoredProcedure;
在这种情况下,存储过程需要您传递一个参数。这可以使用上一节中关于参数的技术来实现,第 6.1.4 节,“使用参数”,如下面的代码片段所示
cmd.Parameters.AddWithValue("@con", "Europe");
参数 @con
的值可以更实际地来自用户输入控件,但为了简单起见,在本例中将其设置为静态字符串。
此时,所有内容都已设置完毕,您可以使用前面部分中学习的技术调用例程。在这种情况下,将使用 MySqlCommand
对象的 ExecuteReader
方法。
以下代码显示了完整的存储过程示例。
using System;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;
public class Tutorial6
{
public static void Main()
{
string connStr = "server=localhost;user=root;database=world;port=3306;password=******";
MySqlConnection conn = new MySqlConnection(connStr);
try
{
Console.WriteLine("Connecting to MySQL...");
conn.Open();
string rtn = "country_hos";
MySqlCommand cmd = new MySqlCommand(rtn, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@con", "Europe");
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine(rdr[0] + " --- " + rdr[1]);
}
rdr.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
conn.Close();
Console.WriteLine("Done.");
}
}
在本节中,您已经了解了如何从 Connector/NET 调用存储过程。到目前为止,我们对 Connector/NET 编程的入门教程就结束了。