學習筆記:存儲過程在asp.net中的應用

今天的主要收獲是研究了存儲過程在asp.net中的應用。主要包括了兩個方面:在代碼中通過編程的方式使用存儲過程和在DataSorce控件使用存儲過程。

第一部分:存儲過程簡要介紹:


1、什么是存儲過程?
存儲過程(PROCEDURE),是SQL數據庫里面的一個術語。通過SQL數據庫提供的編程能力,可以將一系列的SQL命令、函數、編程語句組合起來,連續執行,可以說就是數據庫的批命令。


2、存儲過程的組成:
存儲過程包括:名稱、參數、語句體、返回值四部分組成。
3、存儲過程的簡要語法結構是:

■■■■■■代碼開始■■■■■■
CREATE PROCEDURE [存儲過程的名稱]
 [參數1],[參數2],....
AS
 [語句體]
 RETURN [返回值]
■■■■■■代碼結束■■■■■■ 

例如:

■■■■■■代碼開始■■■■■■


--修改日志分類,集中修改[lc_blogClass]和[BlogClass]

CREATE PROCEDURE dbo.BlogClassUpdate
 /*這是MS SQL2005提供的注釋,我覺得很有代表性就留了下來。
 (
 @parameter1 int = 5, --這是指定默認值的范例
 @parameter2 datatype OUTPUT --這是“輸出”、“返回值”參數的范例
 )
 */
 
 /*
 *參數說明:
 *編號
 *分類名稱
 *分類圖片
 *分類排序
 */
 
 @Id int,
 @ClassName nvarchar(50),
 @ClassPic nvarchar(100),
 @sort int
 
AS
 /* SET NOCOUNT ON */
 IF @Id IS NULL
  RETURN -1
  
 --Insert into   [log] ([log]) values ('BlogClassUpdate !!!!')
 Update [lc_BlogClass] Set [sort] = @sort WHERE Id = @Id
 
 Update [BlogClass] Set [ClassName] = @ClassName,[ClassPic] = @ClassPic  WHERE ClassId = @Id
 
 RETURN 0
■■■■■■代碼結束■■■■■■ 

4、存儲過程的用途
4.1、多條語句連續執行。
有一些連續而且固定的操作,可以封裝成一個存儲過程,為工作提供方便。
4.2、多個操作合并
在應用程序中使用數據庫,有時候會遇到一定的限制,最常見的就是,在某個位置,只允許執行一條語句。在這種情況下,有時候偏偏要連續完成多個操作。比如說上面的范例,程序要求同時修改兩個表,但是只能執行一次修改動作。
4.3、預定義的流程
觸發器實在刪除、更新、插入等操作中觸發的預定義動作,觸發器也可以同時執行多條語句,觸發器的語句體結構和存儲過程是一樣的。所以有人說觸發器就是存儲過程的一種特殊應用。


5、存儲過程和函數

大多數情況下存儲過程和函數都是一樣的。但是也有一些不同。
在SQL SERVER的聯機叢書里有詳細的內容,這里列出部分內容:

存儲過程與函數不同,因為存儲過程不返回取代其名稱的值,也不能直接用在表達式中。
 ——聯機叢書
函數中不能使用臨時表,和動態SQL
 ——CSDN:http://topic.csdn.net/t/20051027/17/4354930.html
另外還可以看看這兩篇文章:

http://www.51testing.com/?141432/action_viewspace_itemid_81171.html
http://topic.csdn.net/t/20051027/17/4354930.html
http://www.cnsdn.com.cn/blog/article.asp?id=2035
http://hi.baidu.com/kevinliu/blog/item/fc9d57da11c215d9b6fd4800.html


第二部分:在代碼中通過編程的方式使用存儲過程
1、基本要求:通過SqlCommand對象執行。
        System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection();
        conn.ConnectionString = this.ConnStr;
        SqlCommand cmd = new SqlCommand();
        conn.Open();
        cmd.Connection = conn;
2、主要步驟:
2.1、指定存儲過程的名稱和command的類型為存儲過程。
        cmd.CommandText = "AddBlogClass";
        cmd.CommandType = CommandType.StoredProcedure;
2.2、添加參數:
        SqlParameter Para1 = new SqlParameter("@ClassName",SqlDbType.NVarChar);
        Para1.Value = TextBoxName.Text;
        cmd.Parameters.Add(Para1);
2.3、執行存儲過程
 int result = cmd.ExecuteNonQuery();
3、完整代碼:

■■■■■■代碼開始■■■■■■

 

Code

 

■■■■■■代碼結束■■■■■■ 


第三部分:在DataSorce控件使用存儲過程
1、沒有參數
對于沒有參數的存儲過程,直接調用就可以了。
1.1、配置數據源
如果是“配置數據源”就要在“自定義語句和存儲過程”中,選擇“存儲過程”那一選項,然后在下拉列表中選擇要使用的存儲過程就行了。

1.2、屬性面板
如果是通過屬性面板設置的,就需要下面這兩個步驟:

A:命令類型中選擇“StoredProcedure”
注:命令類型包括“SelectCommandType”、“UpdateCommandType”等。


B:在命令類型下面相應的查詢(例如SelectCommandType對應的就是SelectQuery)中,單擊“查詢”框里的按鈕。彈出“命令和參數編輯器”,在“Select命令”輸入存儲過程的名稱。然后單擊確定。

2、有參數
2.1、添加參數
有參數的存儲過程,除了要像上面1.1和1.2中那樣添加存儲過程的名稱之外還需要在1.2.B打開的“命令和參數編輯器”中添加參數。
可以在“命令和參數編輯器”的界面上使用“刷新參數”按鈕,也可以使用下面的“添加參數”按鈕。

2.2、添加參數的注意事項

2.2.1
對于Select和Delete命令,不要添加“RETURN_VALUE”參數,如果是全用“刷新參數”產生的,那就手工刪掉。

2.2.2
對于Delete命令,需要指定參數源。一般情況下就是“Control”(控件),然后在下面選擇一個控件(根據控件名)

2.2.3
對于Update命令,【ConflicDetection】不要使用【CompareAllValues】方式的參數,我測試的情況是在這種模式下,無法更新數據。

2.2.4
經常出現的錯誤“為過程或函數 ### 指定了過多的參數。”
在我測試的過程有,有如下幾個原因。
A:對有有參數的存儲過程添加了存儲過程名稱,沒有添加參數
B:有多余的“RETURN_VALUE”參數,參見2.2.1
C:如果GridView控件的字段數量和存儲過程的參數不一致
D:屬性面板的參數名和存儲過程的參數名不一致。

posted @ 2008-10-13 08:18  柳城之城  閱讀(...)  評論(...編輯  收藏
三d开奖结果走势图