This section illustrates how to work with stored procedures.
Putting database-intensive operations into stored procedures lets
you define an API for your database application. You can reuse
this API across multiple applications and multiple programming
languages. This technique avoids duplicating database code, saving
time and effort when you make updates due to schema changes, tune
the performance of queries, or add new database operations for
logging, security, and so on. Before working through this
tutorial, familiarize yourself with the
CREATE PROCEDURE
and
CREATE FUNCTION
statements that
create different kinds of stored routines.
For the purposes of this tutorial, you will create a simple stored
procedure to see how it can be called from MySQL Connector/NET. In the MySQL
Client program, connect to the world
database
and enter the following stored procedure:
DELIMITER //
CREATE PROCEDURE country_hos
(IN con CHAR(20))
BEGIN
SELECT Name, HeadOfState FROM Country
WHERE Continent = con;
END //
DELIMITER ;
Test that the stored procedure works as expected by typing the following into the mysql command interpreter:
CALL country_hos('Europe');
The stored routine takes a single parameter, which is the continent to restrict your search to.
Having confirmed that the stored procedure is present and correct, you can see how to access it from Connector/NET.
Calling a stored procedure from your Connector/NET application is similar
to techniques you have seen earlier in this tutorial. A
MySqlCommand
object is created, but rather than
taking an SQL query as a parameter, it takes the name of the
stored procedure to call. Set the MySqlCommand
object to the type of stored procedure, as shown by the following
code snippet:
string rtn = "country_hos";
MySqlCommand cmd = new MySqlCommand(rtn, conn);
cmd.CommandType = CommandType.StoredProcedure;
In this case, the stored procedure requires you to pass a parameter. This can be achieved using the techniques seen in the previous section on parameters, Section 4.6.1.4, “Working with Parameters”, as shown in the following code snippet:
cmd.Parameters.AddWithValue("@con", "Europe");
The value of the parameter @con
could more
realistically have come from a user input control, but for
simplicity it is set as a static string in this example.
At this point, everything is set up and you can call the routine
using techniques also learned in earlier sections. In this case,
the ExecuteReader
method of the
MySqlCommand
object is used.
The following code shows the complete stored procedure example.
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.");
}
}
In this section, you have seen how to call a stored procedure from Connector/NET. For the moment, this concludes our introductory tutorial on programming with Connector/NET.