這一篇的靈感 來自於Topcat -->ObjectDataSouce結合物件設計方式
進化版!
當然 我們先假設
1.資料表越來越多 ... 能夠再把重複的地方抽離嗎?
2.依照Topcat的方式 ... 每產生一個 objEmployee 物件 就要Select一次資料 ...好像對資料庫有點負擔 ..
基於以上兩點,作為開發的動力!
這一篇的靈感 來自於Topcat -->ObjectDataSouce結合物件設計方式
進化版!
當然 我們先假設
1.資料表越來越多 ... 能夠再把重複的地方抽離嗎?
2.依照Topcat的方式 ... 每產生一個 objEmployee 物件 就要Select一次資料 ...好像對資料庫有點負擔 ..
基於以上兩點,作為開發的動力!
首先 ... 我們把 增刪改 三種方法 抽離
寫成一個objADU 的類別(恩= =、 我是取開頭 ... Add Del Update)
當然 以下所使用到的objData 物件 在之前的文章有提到過
參考如下-->ASP.NET 2.0抽離資料存取 & 連線字串-VB.NET
01 ''' <summary> 02 ''' 增刪改核心元件,資料存取層元件。 By Phoehix - 2008 03 ''' </summary> 04 ''' <remarks></remarks> 05
Public Class objADU
06 
Private oData As New objData() oData As New objData()
07
08 
Protected Sub Add() Sub Add(ByRef SqlTxt As String, ByVal Parameter As SqlParameter)
09
Try
10
oData.SqlExecuteNonQuery(SqlTxt, Parameter)
11
Catch ex As Exception
12
Throw
13
End Try
14
End Sub
15 
Protected Sub Add() Sub Add(ByRef SqlTxt As String, ByVal Parameters As SqlParameter())
16
Try
17
oData.SqlExecuteNonQuery(SqlTxt, Parameters)
18
Catch ex As Exception
19
Throw
20
End Try
21
End Sub
22 
Protected Sub Del() Sub Del(ByRef SqlTxt As String, ByRef Parameter As SqlParameter)
23
Try
24
oData.SqlExecuteNonQuery(SqlTxt, Parameter)
25
Catch ex As Exception
26
Throw
27
End Try
28
End Sub
29 
Protected Sub Del() Sub Del(ByRef SqlTxt As String, ByRef Parameters As SqlParameter())
30
Try
31
oData.SqlExecuteNonQuery(SqlTxt, Parameters)
32
Catch ex As Exception
33
Throw
34
End Try
35
End Sub
36 
Protected Sub Update() Sub Update(ByRef SqlTxt As String, ByRef Parameter As SqlParameter)
37
Try
38
oData.SqlExecuteNonQuery(SqlTxt, Parameter)
39
Catch ex As Exception
40
Throw
41
End Try
42
End Sub
43 
Protected Sub Update() Sub Update(ByRef SqlTxt As String, ByRef Parameters As SqlParameter())
44
Try
45
oData.SqlExecuteNonQuery(SqlTxt, Parameters)
46
Catch ex As Exception
47
Throw
48
End Try
49
End Sub
50
51 
Public Sub New() Sub New()
52
53
End Sub
54
55 
Protected Overrides Sub Finalize() Overrides Sub Finalize()
56
MyBase.Finalize()
57
End Sub
58
End Class 6-宣告一個 oData 物件為objData 順便做初始化
當然 永續發展 為考量 ... 增刪改這三種方法都用多載的方式 ...(傳入一個參數 OR 傳入多個參數)
8~21 執行 Add 傳入SQL字串 和 預存程序
22~35 執行 Del 傳入SQL字串 和 預存程序
36~49 執行 Update傳入SQL字串 和 預存程序
51~57 請自動省略 ...
再來 我們以一個資料表做為範例 News 新聞公告,其他的靠自己~
資料表的設計如下:

N_ID 是 新聞的編號 自動遞增
N_Date 是 發布日期
N_Subject 是 新聞標題
N_Content 是 新聞內容
以下是 objNews 的"物件模型"
001 ''' <summary> 002 ''' News 資料庫物件,資料存取層物件。 By Phoehix - 2008 003 ''' </summary> 004
Public Class objNews
005
Inherits objADU
006
''' <summary> 007
''' 新聞公告編號 008
''' </summary> 009
Private _ID
As Integer 010
''' <summary> 011
''' 發布時間 012
''' </summary> 013
''' <remarks></remarks> 014
Private _Date
As Date 015
''' <summary> 016
''' 標題欄位 017
''' </summary> 018
Private _Subject
As String 019
''' <summary> 020
''' 內容欄位 021
''' </summary> 022
Private _Content
As String 023
024
''' <summary> 025
''' 取得或設定新聞公告的編號(_ID) 026
''' </summary> 027 
Public Property NewsID() Property NewsID() As Integer
028
Get
029
Return _ID
030
End Get
031
Set(ByVal value As Integer)
032
_ID = value
033
End Set
034
End Property
035
''' <summary>
036
''' 取得新聞公告發布時間(_Date)
037
''' </summary>
038 
Public ReadOnly Property NewsDate() ReadOnly Property NewsDate() As Date
039
Get
040
Return _Date
041
End Get
042
End Property
043
''' <summary>
044
''' 取得或設定新聞公告的標題(_Subject)
045
''' </summary>
046 
Public Property NewsSubject() Property NewsSubject() As String
047
Get
048
Return _Subject
049
End Get
050
Set(ByVal value As String)
051
_Subject = value
052
End Set
053
End Property
054
''' <summary>
055
''' 取得或設定新聞公告的內容(_Content)
056
''' </summary>
057 
Public Property NewsContent() Property NewsContent() As String
058
Get
059
Return _Content
060
End Get
061
Set(ByVal value As String)
062
_Content = value
063
End Set
064
End Property
065
''' <summary>
066
''' 初始化 objNews 類別的新執行個體
067
''' </summary>
068 
Public Sub New() Sub New()
069
070
End Sub
071
''' <param name="row"> DataRow。</param>
072 
Public Sub New() Sub New(ByRef row As DataRow)
073
GetNews(row)
074
End Sub
075 
Private Sub GetNews() Sub GetNews(ByRef row As DataRow)
076
Try
077
_ID = Integer.Parse(row(0).ToString())
078
_Date = Date.Parse(row(1).ToString())
079
_Subject = row(2).ToString()
080
_Content = row(3).ToString()
081
Catch ex As Exception
082
Throw New Exception(ex.Message)
083
End Try
084
End Sub
085
''' <summary>
086
''' 新增一筆消息
087
''' </summary>
088 
Public Overloads Sub Add() Overloads Sub Add()
089
Try
090
091
Dim SqlTxt As String = "INSERT INTO [News] ([N_Subject], [N_Content]) VALUES (@N_Subject, @N_Content)"
092
Dim Parameters(1) As SqlParameter
093
Parameters(0) = New SqlParameter("@N_Subject", _Subject)
094
Parameters(1) = New SqlParameter("@N_Content", _Content)
095
Add(SqlTxt, Parameters)
096
Catch ex As Exception
097
Throw New Exception(ex.Message)
098
End Try
099
End Sub
100
''' <summary>
101
''' 刪除一筆消息
102
''' </summary>
103 
Public Overloads Sub Del() Overloads Sub Del()
104
Try
105
Dim SqlTxt As String = "Delete [News] WHERE ([N_ID] = @Original_N_ID)"
106
'Original
107
Dim Parameter As SqlParameter = New SqlParameter("@Original_N_ID", _ID)
108
Del(SqlTxt, Parameter)
109
Catch ex As Exception
110
Throw New Exception(ex.Message)
111
End Try
112
113
End Sub
114
''' <summary>
115
''' 修改單筆消息
116
''' </summary>
117 
Public Overloads Sub Update() Overloads Sub Update()
118
Try
119
Dim SqlTxt As String = "UPDATE News SET N_Subject = @N_Subject, N_Content = @N_Content WHERE N_ID = @Original_N_ID"
120
Dim Parameters(2) As SqlParameter
121
'New Set
122
Parameters(0) = New SqlParameter("@N_Subject", _Subject)
123
Parameters(1) = New SqlParameter("@N_Content", _Content)
124
'Original
125
Parameters(2) = New SqlParameter("@Original_N_ID", _ID)
126
Update(SqlTxt, Parameters)
127
Catch ex As Exception
128
Throw New Exception(ex.Message)
129
End Try
130
End Sub
131
132 
Protected Overrides Sub Finalize() Overrides Sub Finalize()
133
MyBase.Finalize()
134
End Sub
135
End Class
首先
再第五行的地方 繼承objADU (真的吃撐了= = 分離出來 多寫好多 哈)
再來 前面的部份 都跟TopCat設計的類似
只有在 72~74的地方 本來是傳 ID過來 換成 傳遞row過來
然後再75~84的部份 由傳入的row 提取資料
再來88~130的部份 Add,Del,Update 改為 Overloads 因為 繼承自objADU 已經有相同名稱的方法了
裡面 就是把 SqlTxt 和 Parameter(預存程序) 丟給objADU 執行相對應的 Add,Del,Update
再來是 配合ObjectDataSouce的物件,進行新增、修改、刪除、查詢的動作. 也可以把它當作 BLL層 ...
和TopCat不同的地方 在
16-把 SQL 和dt 傳過去給我們的objData類別 把資料都填入dt 再傳回成功/失敗
17-For Each的方式 把DT內的ROW 一一取出
18-把objNews 加入到 物件集合中,把Row 傳遞過去 這樣就可以減少對SQL Server的負擔了 ...
再來的程式碼 都一樣 ... 比較值得一提的是
因為 我把 objNews 寫成一個 命名空間為DAL的類別庫(objConn,objData,objADU 也都是)
關於ObjectDataSource 在MSDN內 有提到過這種方法 --> ObjectDataSource 強型別來源物件範例
以上
Phoenix 8/5