6.1.5 使用存储过程

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

出于本教程的目的,您将创建一个简单的存储过程以查看如何从 MySQL Connector/NET 调用它。在MySQL Client程序中,连接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可能更现实地来自用户输入控件,但为简单起见,在本示例中将其设置为静态字符串。

此时,一切都已设置好,您可以使用也在前面几节中学到的技术调用例程。在这种情况下,使用对象 的ExecuteReader方法 。MySqlCommand

以下代码显示了完整的存储过程示例。

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 进行编程的介绍性教程到此结束。