程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> NHibernate之旅(15):探索NHibernate中使用存儲過程(上)

NHibernate之旅(15):探索NHibernate中使用存儲過程(上)

編輯:關於.NET

引入

上一篇,我們介紹了視圖,征集大家的意見,我接下來可能用三篇篇幅來介紹在NHibernate中如何使用存儲過程的整個詳細過程,這些全是在實際運用中積累的經驗,涉及剛剛使用的錯誤信息,如何修改存儲過程,並且比較沒有使用存儲過程的不同點,並非官方比較權威的資料,所以敬請參考。

使用MyGeneration生成存儲過程

由於寫存儲過程不是這節的重點,我們來利用MyGeneration代碼生成工具來利用為Customer表生成插入、更新、刪除記錄的存儲過程。順便也來學習MyGeneration開源的生成器怎麼用的,如果你還沒有,請到這裡下載安裝。

安裝完之後,打開MyGeneration,如果你第一次使用MyGeneration會自動彈出“默認設置”對話框,需要你對MyGeneration設置數據庫連接字符串、模板語言、數據庫驅動、模板存放路徑等信息,截圖如下(由於這篇圖片比較多,點擊圖片放大):

我們要首先配置數據庫連接字符串,如果你對手寫感興趣,你可以直接在文本框中修改具體字符串;如果你和我一樣,就點擊“OLEDB...”按鈕利用界面配置連接字符串,點擊按鈕之後,出來“數據連接屬性”對話框,中文的哦,MyGeneration直接調用SQL Server的配置對話框,按下面圖示,填寫自己的連接字符串信息:

然後點擊“確定”,這個對話框的連接信息將保存在“默認配置”對話框中,點擊“Save”保存配置信息。

MyGeneration使用提示

如果你的操作系統是Windows Vista,請右擊“以管理員身份運行”MyGeneration,這一點我還是比較郁悶的,弄了很久MyGeneration配置信息和模板保存失敗,後來換成以管理員身份運行問題全部解決。

這時,MyGeneration主界面就打開了,點擊工具欄的第三個按鈕,打開“模板浏覽器”窗口,截圖如下:

展開Microsoft SQL Server節點,找到“Script Insert/Update/Delete Procedures for SQL Server”模板,右擊選擇執行,我們利用這個模板為Customer表生成增刪改存儲過程。

打開後,這個模板界面如下,選擇輸出路徑和數據庫表,這裡我輸入路徑為桌面,選擇Customer表,點擊OK。截圖如下:

這時在桌面上生成sql_procs_Customer.sql文件,打開SQL Server Management Studio執行這個SQL腳本,展開NHibernateSample表下的存儲過程,已經出來了三個存儲過程,分別是CustomerDelete、CustomerInsert、CustomerUpdate。

好了,我們使用MyGeneration生成存儲過程,這個工作完成了,但是噩夢開始了......

實例分析

還是一步一步來,依次從刪除對象、新建對象、更新對象、查詢對象來介紹在NHibernate中如何使用存儲過程的整個詳細過程。在NHibernate的映射文件中,在Class元素中提供了<sql-delete>、<sql-insert>、<sql-update>元素用於刪除、新建、更新對象,注意這三個元素順序唯一,就是下圖顯示的順序,在根元素提供了<sql-query>元素用來查詢對象,下圖顯示在Class元素中的增刪改存儲過程元素。

1.刪除對象

這篇數據訪問層中代碼我們使用NHibernate之旅(6):探索NHibernate中的事務中的代碼,測試代碼在NHibernate之旅(5):探索Insert, Update, Delete操作中體現,無需任何改動。

Step1:為了比較,我們先執行DeleteCustomerTest()測試方法,沒有使用存儲過程下刪除對象生成SQL語句如下:

DELETE FROM Customer WHERE CustomerId = @p0 AND Version = @p1; @p0 = '7', @p1 = '1'

Step2:修改映射文件添加存儲過程,打開Customer.hbm.xml映射文件,在Class元素下添加<sql-delete>節點,調用CustomerDelete存儲過程,CustomerDelete存儲過程有一個CustomerId參數,這裡用一個問號表示:

<sql-delete>exec CustomerDelete ?</sql-delete>

Step3:執行DeleteCustomerTest()測試方法,出現錯誤“NHibernate.StaleObjectStateException : Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [DomainModel.Entities.Customer#4]”,這個錯誤是存儲過程寫法錯誤,我們修改CustomerDelete存儲過程,去掉SET NOCOUNT ON,代碼片段如下:

ALTER PROCEDURE [dbo].[CustomerDelete]
(
  @CustomerId int
)
AS
  --SET NOCOUNT ON
  DELETE
  FROM  [Customer]
  WHERE
    [CustomerId] = @CustomerId
  RETURN @@Error

Step4:執行DeleteCustomerTest()測試成功,NHibernate生成語句如下:

exec CustomerDelete @p0; @p0 = '6', @p1 = '1'

恩,成功了,但是在看看存儲過程,想想存儲過程中寫的SQL語句,和沒有使用存儲過程,NHibernate生成的SQL語句有些不同,顯然沒有顧及到版本控制問題,使用存儲過程NHibernate生成語句無緣無故增加了一個參數@p1,我們來解決一下:

Step5:修改存儲過程添加Version處理:

ALTER PROCEDURE [dbo].[CustomerDelete]
(
  @CustomerId int,
  @Version int
)
AS
  DELETE
  FROM  [Customer]
  WHERE 
  [CustomerId] = @CustomerId and [Version] = @Version
  RETURN @@Error

Step6:執行DeleteCustomerTest()測試,發生錯誤:“過程或函數 'CustomerDelete' 需要參數 '@Version',但未提供該參數。” 哦,原來映射文件參數數量沒有改。

Step7:修改存儲過程參數數量,打開映射文件在<sql-delete>中添加一個參數即添加“,?”

<sql-delete>exec CustomerDelete ?,?</sql-delete>

Step8:最後執行DeleteCustomerTest()測試成功,NHibernate生成SQL語句如下,和NHibernate沒有使用存儲過程一樣了,考慮了版本控制問題,完全符合。OK!!

exec CustomerDelete @p0,@p1; @p0 = '8', @p1 = '1'

當然了,如果你不想使用存儲過程,也可以直接在<sql-delete>中寫SQL語句,像這樣,照樣用。

<sql-delete>DELETE FROM [Customer] WHERE [CustomerId] = ? and [Version] =?</sql-delete>結語

這篇就說到這裡了,主要學習怎麼使用MyGeneration提供的模板創建存儲過程和刪除對象存儲過程的使用,下篇繼續創建、更新、查詢對象存儲過程的使用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved