VS Studio可以帮助我们通过简单的拖拽生成Typed DataSet。同时自动生成了DataAdapter,更加简化了数据的访问操作。
下面是我基于VS 2005编写的一个类,为基于Typed DataSet的数据访问提供了比较简单的方法。
基类使用泛型,反射等方法实现了数据访问的封装。在定义实体类时,只需要继承该基类就可以实现数据的读取、保存和删除操作。
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.Reflection;
5
using System.Data;
6
7
namespace SimpleCode.Core.Model
8

{
9
public class ModelBase<TAdapter, TDataTable, TRow> : SimpleCode.Core.Interface.IModel
10
{
11
12
Variable define#region Variable define
13
14
private object m_Adapter;
15
private Type m_TypeAdpt;
16
17
18
private object m_Table;
19
private Type m_TypeTable;
20
21
22
private object m_Row;
23
private Type m_TypeRow;
24
25
26
private TRow m_CurrentItem;
27
28
29
private TDataTable m_Items;
30
31
private string m_ItemId;
32
33
private string m_TableName;
34
35
#endregion
36
37
Property define#region Property define
38
39
/**//// <summary>
40
/// 适配器
41
/// </summary>
42
public TAdapter Apapter
43
{
44
get
{ return (TAdapter)m_Adapter; }
45
}
46
47
/**//// <summary>
48
/// 数据表
49
/// </summary>
50
public TDataTable Table
51
{
52
get
{ return (TDataTable)m_Table; }
53
}
54
55
/**//// <summary>
56
/// 数据表中的所有数据
57
/// </summary>
58
public TDataTable Items
59
{
60
get
61
{
62
if (m_Items == null)
63
{
64
this.m_Items = GetItems();
65
}
66
return m_Items;
67
}
68
}
69
70
/**//// <summary>
71
/// 当前的数据项
72
/// </summary>
73
public TRow CurrentItem
74
{
75
get
{ if (this.m_CurrentItem != null) return this.m_CurrentItem; else return this.m_CurrentItem = NewRow(); }
76
set
{ this.m_CurrentItem = value; }
77
}
78
79
#endregion
80
81
Constructor#region Constructor
82
83
public ModelBase()
84
{
85
Initialize();
86
}
87
88
public ModelBase(string id)
89
: this()
90
{
91
this.m_ItemId = id;
92
m_CurrentItem = GetItemById(this.m_ItemId);
93
}
94
95
/**//// <summary>
96
/// 初始化
97
/// </summary>
98
private void Initialize()
99
{
100
//初始化适配器
101
m_TypeAdpt = typeof(TAdapter);
102
m_Adapter = Activator.CreateInstance<TAdapter>();
103
104
//初始化数据表
105
m_TypeTable = typeof(TDataTable);
106
m_Table = Activator.CreateInstance<TDataTable>();
107
108
//初始化数据行
109
m_TypeRow = typeof(TRow);
110
111
this.m_TableName = ((DataTable)this.m_Table).TableName;
112
}
113
114
#endregion
115
116
Private Method#region Private Method
117
118
/**//// <summary>
119
/// 获取所有数据
120
/// </summary>
121
/// <returns></returns>
122
private TDataTable GetItems()
123
{
124
MethodInfo method = this.m_TypeAdpt.GetMethod("GetData");
125
return (TDataTable)method.Invoke(this.m_Adapter, null);
126
}
127
128
/**//// <summary>
129
/// 删除数据
130
/// </summary>
131
/// <param name="rows"></param>
132
private void DeleteRow(TRow[] rows)
133
{
134
foreach (TRow row in rows)
135
{
136
DataRow dr = row as DataRow;
137
dr.Delete();
138
}
139
MethodInfo methodUpdate = this.m_TypeAdpt.GetMethod("Update", new Type[]
{ typeof(System.Data.DataRow[]) });
140
object[] parameters =
{ rows };
141
methodUpdate.Invoke(this.m_Adapter, parameters);
142
}
143
144
/**//// <summary>
145
/// 删除当前数据
146
/// </summary>
147
private void DeleteRow()
148
{
149
DataRow dr = this.m_CurrentItem as DataRow;
150
dr.Delete();
151
152
MethodInfo methodUpdate = this.m_TypeAdpt.GetMethod("Update", new Type[]
{ typeof(System.Data.DataRow) });
153
object[] parameters =
{ this.m_CurrentItem };
154
methodUpdate.Invoke(this.m_Adapter, parameters);
155
}
156
157
/**//// <summary>
158
/// 新建数据项
159
/// </summary>
160
/// <returns></returns>
161
private TRow NewRow()
162
{
163
MethodInfo method = this.m_TypeTable.GetMethod(string.Format("New{0}Row", this.m_TableName));
164
return (TRow)method.Invoke(this.m_Table, null);
165
}
166
167
/**//// <summary>
168
/// 保存当前数据
169
/// </summary>
170
/// <returns></returns>
171
private void SaveItem()
172
{
173
DataRow dr = this.m_CurrentItem as DataRow;
174
175
//如果DataRowState为Detached,则为新增数据
176
if (dr.RowState == DataRowState.Detached)
177
{
178
((DataTable)this.m_Table).Rows.Add(dr);
179
180
MethodInfo methodUpdate = this.m_TypeAdpt.GetMethod("Update", new Type[]
{ typeof(TDataTable) });
181
methodUpdate.Invoke(this.m_Adapter, new object[]
{ (TDataTable)this.m_Table });
182
}
183
else
184
{
185
MethodInfo methodUpdate = this.m_TypeAdpt.GetMethod("Update", new Type[]
{ typeof(DataRow) });
186
methodUpdate.Invoke(this.m_Adapter, new object[]
{ this.m_CurrentItem });
187
}
188
}
189
190
#endregion
191
192
Public Method#region Public Method
193
194
/**//// <summary>
195
/// 获取复合条件的数据
196
/// </summary>
197
/// <param name="filter">筛选条件</param>
198
/// <returns></returns>
199
public TRow[] GetItems(string filter)
200
{
201
DataTable dt = this.Items as DataTable;
202
TRow[] rows = dt.Select(filter) as TRow[];
203
204
if (rows.Length > 0)
205
{
206
return rows;
207
}
208
return default(TRow[]);
209
}
210
211
/**//// <summary>
212
/// 获取制定Id的数据行
213
/// </summary>
214
/// <param name="id"></param>
215
/// <returns></returns>
216
public TRow GetItemById(string id)
217
{
218
219
DataTable dt = this.Items as DataTable;
220
//获取表的主键
221
DataColumn[] cols = dt.PrimaryKey;
222
223
//ToDo:考虑多主键的情况
224
225
string filter = string.Format("{0} = '{1}'", cols[0].ColumnName, id);
226
227
TRow[] rows = dt.Select(filter) as TRow[];
228
if (rows.Length > 0)
229
{
230
return rows[0];
231
}
232
return default(TRow);
233
}
234
235
IModel Members#region IModel Members
236
237
public bool Delete()
238
{
239
try
240
{
241
//如果数据有主外键关系,则删除不成功。
242
DeleteRow();
243
return true;
244
}
245
catch (Exception ex)
246
{
247
throw new Exception(ex.StackTrace);
248
}
249
}
250
251
public bool Save()
252
{
253
try
254
{
255
SaveItem();
256
return true;
257
}
258
catch (Exception ex)
259
{
260
throw new Exception(ex.StackTrace);
261
}
262
}
263
264
#endregion
265
266
#endregion
267
268
}
269
}
270
在数据层中创建Typed DataSet
2

3

4

5

6

7

8



9

10



11

12


13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37


38

39


40

41

42

43



44



45

46

47


48

49

50

51



52



53

54

55


56

57

58

59



60

61



62

63



64

65

66

67

68

69

70


71

72

73

74



75



76



77

78

79

80

81


82

83

84



85

86

87

88

89

90



91

92

93

94

95


96

97

98

99



100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116


117

118


119

120

121

122

123



124

125

126

127

128


129

130

131

132

133



134

135



136

137

138

139



140



141

142

143

144


145

146

147

148



149

150

151

152



153



154

155

156

157


158

159

160

161

162



163

164

165

166

167


168

169

170

171

172



173

174

175

176

177



178

179

180



181



182

183

184



185



186



187

188

189

190

191

192


193

194


195

196

197

198

199

200



201

202

203

204

205



206

207

208

209

210

211


212

213

214

215

216

217



218

219

220

221

222

223

224

225

226

227

228

229



230

231

232

233

234

235


236

237

238



239

240



241

242

243

244

245

246



247

248

249

250

251

252



253

254



255

256

257

258

259



260

261

262

263

264

265

266

267

268

269

270


在业务层中定义Customer类
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using SimpleCode.Demo.DataModel;
5
using SimpleCode.Demo.DataModel.DemoDataTableAdapters;
6
using SimpleCode.Core.Model;
7
8
namespace SimpleCode.Demo.BL
9

{
10
public class Customer : ModelBase<CustomerTableAdapter,DemoData.CustomerDataTable,DemoData.CustomerRow>
11
{
12
public Customer()
{ }
13
14
public Customer(string id):base(id)
{}
15
}
16
}

2

3

4

5

6

7

8

9



10

11



12



13

14



15

16

在应用层中可以通过以下方式访问
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using SimpleCode.Demo.BL;
5
6
namespace SimpleCode.Demo.Test
7

{
8
class Program
9
{
10
static void Main(string[] args)
11
{
12
Customer myCustomer = new Customer();
13
myCustomer.CurrentItem.CustomerID = "00125";
14
myCustomer.CurrentItem.Name = "Jason Lee";
15
myCustomer.CurrentItem.Address = "Shanghai";
16
//Add Customer Informations
17
myCustomer.Save();
18
19
Customer myCustomer2 = new Customer("00125");
20
21
Console.WriteLine("Customer Name is " + myCustomer2.CurrentItem.Name);
22
}
23
}
24
}
25

2

3

4

5

6

7



8

9



10

11



12

13

14

15

16

17

18

19

20

21

22

23

24

25
