调试环境: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();
}
}
Asp.net调用Access存储过程
最新推荐文章于 2024-09-27 19:45:19 发布