Asp.net調用Access存儲過程
關鍵字: asp.net調用access的存儲過程
調試環境:WinXP-sp2+Access2000+Visual Studio.net 2005
【摘 要】本文闡述了存儲過程在開發三層或N層數據庫應用程序的優勢,並通過示例給出了在Access中建立“存儲過程”和用Asp.net調用的方法及需注意的問題。
在開發三層或N層結構的數據庫應用程序時,數據訪問層對數據庫的訪問大都採用調用“存儲過程”的方式進行。相對於使用的是SQL命令文本來實現數據庫的訪問而言,利用存儲過程使數據庫和數據訪問層彼此獨立,增強了系統設計的靈活性,當數據庫發生變化時只需改變存儲過程的語句而無需改變程序代碼。另外,在存儲過程中可以使用參數傳遞,避免了在使用帶參數的 SQL 語句時參數值在字符串中拼接問題。
然而,存儲過程只有象SQL Server等這樣較大型的數據庫才支持,而對於開發基於Access這樣的輕量級數據庫應用程序時更多使用的是SQL命令文本來實現數據庫的訪問。事實上,Access的“查詢”也具有類似於SQL Server“存儲過程”的功能,雖功能上遠不及SQL Server下的“存儲過程”,但調用方法和調用SQL Server“存儲過程”的方法幾乎相同,因此掌握調用Access的“存儲過程”,對設計出結構優良、移植性強的數據庫應用程序是大有裨益的。
下面以Asp.net 2.0和Access2000爲例,說明其調用方法。
一、建立示例數據庫及查詢
1、 建立示例數據庫tstSp.mdb:
2、建立表StuGrade,結構如圖所示:
2、 建立查詢:
在Access2000中,選擇“查詢”--à“設計視圖”--à“SQL視圖”,建立如下查詢
1) 查詢QuerySp:
SELECT * FROM StuGrade;
2) 查詢InsertSp:
INSERT INTO StuGrade ( Name, Chinese ) VALUES ([Name], [Chinese]);
注:參數值需用“ [ ] ”括起來,下同。
3) 查詢UpdateSp:
UPDATE StuGrade SET Chinese = [chVal] WHERE Name=[stuName];
4) 查詢DeleteSp:
DELETE * FROM StuGrade WHERE Name=[stuName];
需要說明的是,Access的查詢不能象SQL Server那樣支持多條 SQL 語句和邏輯語句。
二、建立數據訪問層
數據訪問層類文件TstDal.cs
…
using System.Data.OleDb;
namespace TstDal
{public class Dal
{ …
public string GetConnStr // 數據庫連接字符串屬性
{ get
{ return "provider=Microsoft.Jet.OLEDB.4.0;Data Source="+
ystem.Web.HttpContext.Current.Server.MapPath("App_Data/tstSp.mdb") + ";";
}
}
public OleDbDataReader ExecQuerySp()
{ // 調用“查詢QuerySp”
OleDbConnection myConnStr = new OleDbConnection(this.GetConnStr);
OleDbCommand myCmd = new OleDbCommand("QuerySp", myConnStr);
myCmd.CommandType = CommandType.StoredProcedure;
myConnStr.Open();
OleDbDataReader ret = myCmd.ExecuteReader(CommandBehavior.CloseConnection);
return ret;
}
public void ExecInsertSp(string Para1,string Para2)
{ // 調用“查詢InsertSp”
OleDbConnection myConnStr = new OleDbConnection(this.GetConnStr);
OleDbCommand myCmd = new OleDbCommand("InsertSp", myConnStr);
myCmd.CommandType = CommandType.StoredProcedure;
myCmd.Parameters.Add("Name", OleDbType.Char);
myCmd.Parameters["Name"].Value = Para1;
myCmd.Parameters.Add("Chinese", OleDbType.Single);
myCmd.Parameters["Chinese"].Value = float.Parse(Para2);
myConnStr.Open();
myCmd.ExecuteNonQuery();
myConnStr.Close();
}
public void ExecUpdateSp(string Para1, string Para2)
{ // 調用“查詢UpdateSp”
OleDbConnection myConnStr = new OleDbConnection(this.GetConnStr);
OleDbCommand myCmd = new OleDbCommand("UpdateSp", myConnStr);
myCmd.CommandType = CommandType.StoredProcedure;
myCmd.Parameters.Add("chVal", OleDbType.Single);
myCmd.Parameters["chVal"].Value = float.Parse(Para2);
myCmd.Parameters.Add("stuName", OleDbType.Char);
myCmd.Parameters["stuName"].Value = Para1;
myConnStr.Open();
myCmd.ExecuteNonQuery();
myConnStr.Close();
}
public void ExecDeleteSp(string Para1)
{ // 調用“查詢DeleteSp”
OleDbConnection myConnStr = new OleDbConnection(this.GetConnStr);
OleDbCommand myCmd = new OleDbCommand("DeleteSp", myConnStr);
myCmd.CommandType = CommandType.StoredProcedure;
myCmd.Parameters.Add("stuName", OleDbType.Char);
myCmd.Parameters["stuName"].Value = Para1;
myConnStr.Open();
myCmd.ExecuteNonQuery();
myConnStr.Close();
}
}
}
需要說明的是,Access“存儲過程”不支持命名參數,即參數是以“順序”而非“名字”來識別的,並且參數前不能有@符號,這一點在調用時需特別注意。
三、建立用戶界面層
1、界面設計Default.aspx(如圖所示):
控件 ID
GridView TstGv
TextBox TxtName
TxtChn
Button BtnInsert
BtnUpdate
BtnDelete
控件屬性設置
2、界面後臺代碼:
Default.aspx.cs
…
using TstDal;
public partial class _Default : System.Web.UI.Page
{ protected void TstDataList() // 調用數據庫訪問類並綁定到控件函數
{ Dal QuerySp = new Dal();
TstGv.DataSource = QuerySp.ExecQuerySp();
TstGv.DataBind();
}
protected void Page_Load(object sender, EventArgs e)
{ this.TstDataList(); }
protected void BtnInsert_Click(object sender, EventArgs e)
{ Dal InsertSp = new Dal();
InsertSp.ExecInsertSp(TxtName.Text.Trim(), TxtChn.Text.Trim()); // 調用數據庫訪問類
this.TstDataList();
}
protected void BtnUpdate_Click(object sender, EventArgs e)
{ Dal UpdateSp = new Dal();
UpdateSp.ExecUpdateSp(TxtName.Text.Trim(), TxtChn.Text.Trim());
this.TstDataList();
}
protected void BtnDelete_Click(object sender, EventArgs e)
{ Dal DeleteSp = new Dal();
DeleteSp.ExecDeleteSp(TxtName.Text.Trim());
this.TstDataList();
}
}