本節說明如何使用預存程序。將資料庫密集型作業放入預存程序中,可讓您為資料庫應用程式定義 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
的值更實際的情況可能是來自使用者輸入控制項,但為了簡化,在此範例中它會設定為靜態字串。
此時,所有項目都已設定完成,您可以使用稍早章節中也學到的技術來呼叫常式。在此情況下,會使用 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 進行程式設計的入門教學課程。