練習2:存儲過程和使用程序塊更新數據
該練習將示范如何用數據訪問應用程序調用存儲過程,並使用強類型的DataSet來更新數據。
第一步
打開DataEx2.sln項目,默認的安裝路徑應該為C:\Program Files\Microsoft Enterprise Library January 2006\labs\cs\Data Access\exercises\ex02\begin,並編譯。
第二步 在QuickStarts數據庫中添加Categories數據表
運行批處理文件SetUpEx02.bat,它默認的路徑安裝路徑為C:\Program Files\Microsoft Enterprise Library January 2006\labs\cs\Data Access\exercises\ex02\DbSetup,默認的服務器實例為(local)\SQLEXPRESS,如果需要修改,用記事本打開SetUpEx02.bat,修改為自己的德數據庫服務器實例。執行後將會在數據庫中創建Categories數據表和存儲過程GetCategories,並會在表中插入一些數據。
第三步 回顧應用程序
在解決方案管理器中,選中MainForm.cs文件,選擇 View | Designer 菜單,應用程序主要是選擇一個特定的Category,它將會加載該類別下的所有產品,允許我們作一些修改並保存。
第四步 實現數據的讀取
1.在解決方案管理器中選擇MainForm.cs,選擇View | Code 菜單命令,在代碼中添加如下命名空間,在這之前請先添加對Data和Common兩個程序集的引用,可以參考練習一。
using Microsoft.Practices.EnterpriseLibrary.Data;
2.在窗體中加入如下私有域,後面將會在多個地方用到該數據庫實例。
private Database _db = DatabaseFactory.CreateDatabase("QuickStarts Instance");
3.在MainForm_Load方法中加入如下代碼
private void MainForm_Load(object sender, System.EventArgs e)
{
this.cmbCategory.Items.Clear();
// TODO: Use a DataReader to retrieve Categories
using (IDataReader dataReader = _db.ExecuteReader("GetCategories"))
{
// Processing code
while (dataReader.Read())
{
Category item = new Category(
dataReader.GetInt32(0),
dataReader.GetString(1),
dataReader.GetString(2));
this.cmbCategory.Items.Add(item);
}
}
if (this.cmbCategory.Items.Count > 0)
this.cmbCategory.SelectedIndex = 0;
}
重載的方法Database.ExecuteReader,有一個字符串類型的參數,通過它來指定存儲過程的名稱,在這裡我們不用做任何數據庫連接方面的管理,但是在DataReader使用完畢後釋放很重要,這些都會由上面的代碼來完成,當DataReader釋放後,數據庫連接也將被關閉。
4.在cmbCategory_SelectedIndexChanged方法中加入如下代碼,它將根據我們選擇的類別來讀取對應的Product的集合。
private void cmbCategory_SelectedIndexChanged(object sender, System.EventArgs e)
{
this.dsProducts.Clear();
Category selectedCategory = (Category)this.cmbCategory.SelectedItem;
if (selectedCategory == null)
return;
// TODO: Retrieve Products by Category
_db.LoadDataSet(
"GetProductsByCategory",
this.dsProducts,
new string[] { "Products" },
selectedCategory.CategoryId);
}
在數據訪問應用程序塊中Database類提供了兩個關於DataSet的方法ExecuteDataSet和LoadDataSet。ExecuteDataSet返回一個新的DataSet而LoadDataSet則返回一個已經存在的DataSet。