Asp.net调用Access存储过程

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();

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章