文档首页
MySQL Connector/NET 开发者指南
相关文档 下载本手册
PDF (US Ltr) - 1.3Mb
PDF (A4) - 1.3Mb


6.1.5 使用存储过程

本节说明如何使用存储过程。将数据库密集型操作放入存储过程可以让您为数据库应用程序定义 API。您可以在多个应用程序和多种编程语言中重用此 API。这种技术避免了数据库代码重复,在您因架构更改、调整查询性能或添加用于日志记录、安全等的新数据库操作而进行更新时,可以节省时间和精力。在学习本教程之前,请熟悉用于创建不同类型存储例程的 CREATE PROCEDURECREATE 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 编程的入门教程就结束了。