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

    }

}

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