1
1、处理脱机数据,在多层应用程序中很有用。
2
2、可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法。
3![]()
4
3、处理分级数据
5![]()
6
4、缓存更改
7![]()
8
5、XML的完整性:DataSet对象和XML文档几乎是可互换的。
9![]()
10
二、使用介绍
11![]()
12
1、创建DataSet对象:DataSet ds = new DataSet("DataSetName");
13![]()
14
2、查看调用SqlDataAdapter.Fill创建的结构
15![]()
16
da.Fill(ds,"Orders");
17![]()
18
DataTable tbl = ds.Table[0];
19![]()
20
foreach(DataColumn col in tbl.Columns)
21![]()
22
Console.WriteLine(col.ColumnName);
23![]()
24
3、查看SqlDataAdapter返回的数据
25![]()
26
①、DataRow对象
27![]()
28
DataTable tbl = ds.Table[0];
29![]()
30
DataRow row = tbl.Row[0];
31![]()
32
Console.WriteLine(ros["OrderID"]);
33![]()
34
②、检查存储在DataRow中的数据
35![]()
36
DataTable tbl = row.Table;
37![]()
38
foreach(DataColumn col in tbl.Columns)
39![]()
40
Console.WriteLine(row[col]);
41![]()
42
③、检查DatTable中的DataRow对象
43![]()
44
foreach(DataRow row in tbl.Rows)
45![]()
46
DisplayRow(row);
47![]()
48
4、校验DataSet中的数据
49![]()
50
①、校验DataColumn的属性:ReadOnly,AllowDBNull,MaxLength,Unique
51![]()
52
②、DataTable对象的Constrains集合:UiqueConstraints,Primarykey,ForeignkeyConstraints
53![]()
54
通常不必刻意去创建ForeignkeyConstraints,因为当在DataSet的两个DataTable对象之间创建关系时会创建一个。
55![]()
56
③、用SqlDataAdapter.Fill模式来检索模式信息
57![]()
58
5、编写代码创建DataTable对象
59![]()
60
①、创建DataTable对象:DataTable tbl = new DataTable("TableName");
61![]()
62
②、将DataTable添加到DataSet对象的Table集合
63![]()
64
DataSet ds = new DataSet();
65![]()
66
DataTable tbl = new DataTable("Customers");
67![]()
68
ds.Tables.Add(tbl);
69![]()
70
71![]()
72
DataSet ds = new DataSet();
73![]()
74
DataTable tbl = ds.Tables.Add("Customers");
75![]()
76
DataTable对象只能存在于至多一个DataSet对象中。如果希望将DataTable添加到多个DataSet中,就必须使用Copy方法或Clone方法。Copy方法创建一个与原DataTable结构相同并且包含相同行的新DataTable;Clone方法创建一个与原DataTable结构相同,但没有包含任何行的新DataTable。
77![]()
78
③、为DataTable添加列
79![]()
80
DataTable tbl = ds.Tables.Add("Orders");
81![]()
82
DataColumn col =tbl.Columns.Add("OrderID",typeof(int));
83![]()
84
col.AllowDBNull = false;
85![]()
86
col.MaxLength = 5;
87![]()
88
col.Unique = true;
89![]()
90
tbl.PrimaryKey = new DataColumn[]{tbl.Columns["CustomersID"]};
91![]()
92
当设置主键时,AllowDBNull自动设置为False;
93![]()
94
④、处理自动增量列
95![]()
96
DataSet ds = new DataSet();
97![]()
98
DataTable tbl = ds.Tables.Add("Orders");
99![]()
100
DataColumn col = tbl.Columns.Add("OrderID",typeof(int));
101![]()
102
col.AutoIncrement = true;
103![]()
104
col.AutoIncrementSeed = -1;
105![]()
106
col.AutoIncrementStep = -1;
107![]()
108
col.ReadOnly = true;
109![]()
110
⑤、添加基于表达式的列
111![]()
112
tbl.Columns.Add("ItemTotal",typeof(Decimal),"Quantity*UnitPrice");
113![]()
114
6、修改DataTable内容
115![]()
116
①、添加新DataRow
117![]()
118
DataRow row = ds.Tables["Customers"].NewRow();
119![]()
120
row["CustomerID"] = "ALFKI";
121![]()
122
ds.Tables["Customers"].Rows.Add(row);
123![]()
124
125![]()
126
object[] aValues ={"ALFKI","Alfreds","Anders","030-22222"};
127![]()
128
da.Tables["Customers"].LoadDataRow(aValues,false);
129![]()
130
②、修改当前行
131![]()
132
修改行的内容逼供内不会自动修改数据库中相应的内容,对行所做的修改被视为是随后将使用SqlDataAdapter对象来提交交给数据库的待定的更改。
133![]()
134
DataRow rowCustomer;
135![]()
136
rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON");
137![]()
138
if(rowCustomer == null)
139![]()
140
//没有查找客户
141![]()
142
else
143![]()
144
{
145![]()
146
rowCustomer["CompanyName"] ="NewCompanyName";
147![]()
148
rowCustomer["ContactName"] ="NewContactName";
149![]()
150
}
151![]()
152
153![]()
154
//推荐使用这种方式
155![]()
156
DataRow rowCustomer;
157![]()
158
rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON");
159![]()
160
if(rowCustomer == null)
161![]()
162
//没有查找客户
163![]()
164
else
165![]()
166
{
167![]()
168
rowCustomer.BeginEdit();
169![]()
170
rowCustomer["CompanyName"] ="NewCompanyName";
171![]()
172
rowCustomer["ContactName"] ="NewContactName";
173![]()
174
rowCustomer.EndEdit();
175![]()
176
}
177![]()
178
179![]()
180
//null表示不修改该列的数据
181![]()
182
obejct[] aCustomer ={null,"NewCompanyName","NewContactName",null}
183![]()
184
DataRow rowCustomer;
185![]()
186
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
187![]()
188
rowCustomer.ItemArray = aCustomer;
189![]()
190
③、处理DataRow的空值
191![]()
192
//查看是否为空
193![]()
194
DataRow rowCustomer;
195![]()
196
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
197![]()
198
if(rowCustomer.IsNull("Phone"))
199![]()
200
Console.WriteLine("It's Null");
201![]()
202
else
203![]()
204
Console.WriteLine("It's not Null");
205![]()
206
207![]()
208
//赋予空值
209![]()
210
rowCustomer["Phone"] = DBNull.Value;
211![]()
212
④、删除DataRow
213![]()
214
DataRow rowCustomer;
215![]()
216
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
217![]()
218
rowCustomer.Delete();
219![]()
220
⑤、清除DataRow
221![]()
222
DataRow rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
223![]()
224
rowCustomer.ItemArray = aCustomer;
225![]()
226
da.Tables["Customers"].Remove(rowCustomer);
227![]()
228
或者
229![]()
230
ds.Tables["Customers"].RemoveAt(intIndex);
231![]()
232
⑥、使用DataRow.RowState属性 :Unchanged,Detached,Added,Modified,Deleted
233![]()
234
private void DemonstrateRowState()
235![]()
236
{
237
// Run a function to create a DataTable with one column.
238
DataTable myTable = MakeTable();
239
DataRow myRow;
240![]()
241
// Create a new DataRow.
242
myRow = myTable.NewRow();
243
// Detached row.
244
Console.WriteLine("New Row " + myRow.RowState);
245![]()
246
myTable.Rows.Add(myRow);
247
// New row.
248
Console.WriteLine("AddRow " + myRow.RowState);
249![]()
250
myTable.AcceptChanges();
251
// Unchanged row.
252
Console.WriteLine("AcceptChanges " + myRow.RowState);
253![]()
254
myRow["FirstName"] = "Scott";
255
// Modified row.
256
Console.WriteLine("Modified " + myRow.RowState);
257![]()
258
myRow.Delete();
259
// Deleted row.
260
Console.WriteLine("Deleted " + myRow.RowState);
261
}
262![]()
263
⑦、检查DataRow中的挂起更改
264![]()
265
DataRow rowCustomer;
266![]()
267
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
268![]()
269
rowCustomer["CompanyName"] = "NewCompanyName";
270![]()
271
string strNewCompanyName,strOldCompanyName;
272![]()
273
Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Current]);
274![]()
275
Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Original]);
276![]()
277
三、属性方法事件介绍
278![]()
279
1、DataSet
280![]()
281
①、属性
282![]()
283
CaseSensitive:用于控制DataTable中的字符串比较是否区分大小写。
284![]()
285
DataSetName:当前DataSet的名称。如果不指定,则该属性值设置为"NewDataSet"。如果将DataSet内容写入XML文件,DataSetName是XML文件的根节点名称。
286![]()
287
DesignMode:如果在设计时使用组件中的DataSet,DesignMode返回True,否则返回False。
288![]()
289
HasErrors:表示DataSet中的DataRow对象是否包含错误。如果将一批更改提交给数据库并将DataAdapter对象的ContinueUpdateOnError属性设置为True,则在提交更改后必须检查DataSet的HasErrors属性,以确定是否有更新失败。
290![]()
291
NameSpace和Prefix:指定XML命名空间和前缀
292![]()
293
Relations:返回一个DataRelationCollection对象。
294![]()
295
Tables:检查现有的DataTable对象。通过索引访问DataTable有更好的性能。
296![]()
297
②、方法
298![]()
299
AcceptChanges和RejectChanges:接受或放弃DataSet中所有挂起更改。调用AcceptChanges时,RowState属性值为Added或Modified的所有行的RowState属性都将被设置为UnChanged.任何标记为Deleted的DataRow对象将从DataSet中删除。调用RejectChanges时,任何标记为Added的DataRow对象将会被从DataSet中删除,其他修改过的DatRow对象将返回前一状态。
300![]()
301
Clear:清除DataSet中所有DataRow对象。该方法比释放一个DataSet然后再创建一个相同结构的新DataSet要快。
302![]()
303
Clone和Copy:使用Copy方法会创建与原DataSet具有相同结构和相同行的新DataSet。使用Clone方法会创建具有相同结构的新DataSet,但不包含任何行。
304![]()
305
GetChanges:返回与原DataSet对象具有相同结构的新DataSet,并且还包含原DataSet中所有挂起更改的行。
306![]()
307
GetXml和GetXmlSchema:使用GetXml方法得到由DataSet的内容与她的架构信息转换为XML格式后的字符串。如果只希望返回架构信息,可以使用GetXmlSchema。
308![]()
309
HasChange:表示DataSet中是否包含挂起更改的DataRow对象。
310![]()
311
Merge:从另一个DataSet、DataTable或现有DataSet中的一组DataRow对象载入数据。
312![]()
313
ReadXml和WriteXml:使用ReadXml方法从文件、TextReader、数据流或者XmlReader中将XML数据载入DataSet中。
314![]()
315
Reset:将DataSet返回为未初始化状态。如果想放弃现有DataSet并且开始处理新的DataSet,使用Reset方法比创建一个DataSet的新实例好。
316![]()
317
③、事件
318![]()
319
MergeFailed:在DataSet的Merge方法发生一个异常时触发。
320![]()
321
2、DataTable
322![]()
323
①、属性
324![]()
325
②、方法
326![]()
327
③、事件
328![]()
329
ColumnChanged:在列的内容被改变之后触发
330![]()
331
ColumnChangding:在列的内容被改变之前触发
332![]()
333
RowChanged,RowChanging,RowDeleted,RowDeleting。
334![]()
335
3、DataColumn
336![]()
337
①、属性
338![]()
339
4、DataRow
340![]()
341
①、属性
342![]()
343
HasError:确定行是否包含错误。
344![]()
345
Item:通过指定行的列数,列的名称或DataColumn对象本身,访问列的内容。
346![]()
347
ItemArray:获取或设置行中所有列的值。
348![]()
349
RowError:返回一个包含行错误信息的字符串。
350![]()
351
RowState:返回DataRowState枚举中的值来表示行的当前状态。
352![]()
353
Table:返回DataRow对象所在的DataTable。
354![]()
355
②、方法
356![]()
357
AcceptChanges和RejectChanges:提交和放弃挂起更改。
358![]()
359
BeginEdit、CancelEdit、EndEdit
360![]()
361
ClearErrors:清除DataRow中所有的错误。
362![]()
363
Delete:Delete方法实际上并不从DataRow表的Row集合中删除该DataRow。当调用DataRow对象的Delete方法时,ADO.NET将该行标记为删除,之后调用SqlDataAdapter对象的Update方法来删除其在数据库中对应的行。
364![]()
365
如果希望彻底删除DataRow,可以调用Delete方法,接着再调用它的AccepteChanges方法,还可以使用DataRowCollection对象的Remove方法完成相同的任务。
366![]()
367
浅谈DataSet 的用法
368
DataSet是ADO.NET开发人员为方便数据处理开发出来的,是数据的集合,是为解决DataReader的缺陷设计的,DataReader数据处理速度快,但它是只读的, 而且一旦移到下一行,就不能查看上一行的数据,DataSet则可以自由移动指针。DataSet的数据是与数据库断开的。DataSet还可用于多层应用程序中,如果应用程序运行在中间层的业务对象中来访问数据库,则业务对象需将脱机数据结构传递给客户应用程序。
369![]()
370
DataSet的功能:浏览、排序、搜索、过滤、处理分级数据、缓存更改等。还可以与XML数据互换。DataSet中可包括多个DataTable,可将多个查询结构存到一个DataSet中,方便操作,而DataTable中又包括多个DataRow、DataColumn,可通过这些DataRow、DataColumn来查看、操作其中的数据,而需将操作结果返回给数据库的话,则可以调用DataAdapter的Update方法。
371![]()
372
DataSet的操作:
373![]()
374
DataSet ds=new DataSet();
375
DataTable dt=new DataTable("newTable");
376
ds.Tables.Add(dt);DataSet ds=new DataSet();
377
DataTable dt=ds.Tables.Add("newTable");
378
上述两种方法都可以在DataSet中添加一个DataTable,看需要而进行选择。添加DataTable后,需向其中添加行和列。
379![]()
380
DataSet ds=new DataSet();
381
DataTable dt=ds.Tables.Add("newTables");
382
DataColumn col=dt.Columns.Add("newColumn",typeof(int));
383
col.AllowDBNull=false;
384
col.MaxLength=4;
385
col.Unique=true;
386![]()
387
上述代码向DataSet中的DataTable中添加名为”newColumn”,类型为int且不为空,最大长度为4和唯一性为真的列。
388![]()
389
dt.PrimaryKey=new DataColumn[]{dt.Columns["ID"]}
390
这段代码是继续上面代码的,为一个DataTable中添加一个主键列,主键列是一个数据组,如有多个主键,只需在数组中添加一个列即可。如下:
391![]()
392
dt.PrimaryKey=new DataColumns[]{dt.Columns["OrderID"],dt.Columns["ProductID"]}
393
添加外键:
394![]()
395
ForeignKeyConstraint fk;
396
fk=new ForeignKeyConstraint(ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]);
397
ds.Tables["Orders"].Constraints.Add(fk);
398
//上述代码假如已经为Cusomers表和Orders创建了主键,此句为添加外键约束。
399
上述是根据Customers表和Orders表的CustomerID来创建约束。
400![]()
401
下面介绍修改DataRow中的内容:
402![]()
403
DataRow dr=ds.Tables["Customer"].Rows.Find("ANTON");
404
if(dr==null)
405![]()
406
else
407
{
408
dr.BeginEdit();
409
dr["CompanyName"]="newValue";
410
dr["ContactName"]="newValue2";
411
dr.EndEdit();
412
}
413
//上面代码通过Row集合的Find方法来在DataTable中的行进行定位,找到"ANTON"行,再修改"ANTON"行中CompanyName列和ContactName列的值。通过BeginEdit和EndEdit来缓存对行的修改,还可调用 CancelEdit为取消修改。
414
判断某列是否为空值:
415![]()
416
417![]()
418
DataRow dr=ds.Tables["Customers"].Rows.Find("aaa");
419
if(dr.IsNull("ContactName");
420
..
421
else
422
dr["ContactName"]=DBNull.Value
423
//这里判断ContactName列是否为空,如果不是则为其赋空值,呵,很无厘头的做法,这里只为演示为列赋空值的做法。
424
删除DataRow:
425![]()
426
有两种方法可以删除DataRow,Delete方法和Remove方法和RemoveAt方法。其区别是Delete方法实际上不是从DataTable中删除掉一行,而是将其标志为删除,仅仅是做个记号,而Remove方法则是真正的从DataRow中删除一行,RemoveAt方法是根本行的索引来删除。列:
427![]()
428
DataRow dr=ds.Tables["table"].Rows.Find("a");
429
ds.Tables["table"].Remove(dr);
430
或
431
ds.Tables["table"].Remove(index);
432
//dr 为"a"所在的行,查出后将其删除,index为 "a"所在的索引号。关于DataSet中的其用法,参照MSDN
433![]()
434
435![]()
436
DataRow dr=ds.Tables["Customers"].Rows.Find("aaa");
437
if(dr.IsNull("ContactName");
438
..
439
else
440
dr["ContactName"]=DBNull.Value
441
//这里判断ContactName列是否为空,如果不是则为其赋空值,呵,很无厘头的做法,这里只为演示为列赋空值的做法。
1、处理脱机数据,在多层应用程序中很有用。2
2、可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法。3

4
3、处理分级数据5

6
4、缓存更改7

8
5、XML的完整性:DataSet对象和XML文档几乎是可互换的。9

10
二、使用介绍11

12
1、创建DataSet对象:DataSet ds = new DataSet("DataSetName");13

14
2、查看调用SqlDataAdapter.Fill创建的结构15

16
da.Fill(ds,"Orders");17

18
DataTable tbl = ds.Table[0];19

20
foreach(DataColumn col in tbl.Columns)21

22
Console.WriteLine(col.ColumnName);23

24
3、查看SqlDataAdapter返回的数据25

26
①、DataRow对象27

28
DataTable tbl = ds.Table[0];29

30
DataRow row = tbl.Row[0];31

32
Console.WriteLine(ros["OrderID"]);33

34
②、检查存储在DataRow中的数据35

36
DataTable tbl = row.Table;37

38
foreach(DataColumn col in tbl.Columns)39

40
Console.WriteLine(row[col]);41

42
③、检查DatTable中的DataRow对象43

44
foreach(DataRow row in tbl.Rows)45

46
DisplayRow(row);47

48
4、校验DataSet中的数据49

50
①、校验DataColumn的属性:ReadOnly,AllowDBNull,MaxLength,Unique51

52
②、DataTable对象的Constrains集合:UiqueConstraints,Primarykey,ForeignkeyConstraints53

54
通常不必刻意去创建ForeignkeyConstraints,因为当在DataSet的两个DataTable对象之间创建关系时会创建一个。55

56
③、用SqlDataAdapter.Fill模式来检索模式信息57

58
5、编写代码创建DataTable对象59

60
①、创建DataTable对象:DataTable tbl = new DataTable("TableName");61

62
②、将DataTable添加到DataSet对象的Table集合63

64
DataSet ds = new DataSet();65

66
DataTable tbl = new DataTable("Customers");67

68
ds.Tables.Add(tbl);69

70
71

72
DataSet ds = new DataSet();73

74
DataTable tbl = ds.Tables.Add("Customers");75

76
DataTable对象只能存在于至多一个DataSet对象中。如果希望将DataTable添加到多个DataSet中,就必须使用Copy方法或Clone方法。Copy方法创建一个与原DataTable结构相同并且包含相同行的新DataTable;Clone方法创建一个与原DataTable结构相同,但没有包含任何行的新DataTable。77

78
③、为DataTable添加列79

80
DataTable tbl = ds.Tables.Add("Orders");81

82
DataColumn col =tbl.Columns.Add("OrderID",typeof(int));83

84
col.AllowDBNull = false;85

86
col.MaxLength = 5;87

88
col.Unique = true;89

90
tbl.PrimaryKey = new DataColumn[]{tbl.Columns["CustomersID"]};91

92
当设置主键时,AllowDBNull自动设置为False;93

94
④、处理自动增量列95

96
DataSet ds = new DataSet();97

98
DataTable tbl = ds.Tables.Add("Orders");99

100
DataColumn col = tbl.Columns.Add("OrderID",typeof(int));101

102
col.AutoIncrement = true;103

104
col.AutoIncrementSeed = -1;105

106
col.AutoIncrementStep = -1;107

108
col.ReadOnly = true;109

110
⑤、添加基于表达式的列111

112
tbl.Columns.Add("ItemTotal",typeof(Decimal),"Quantity*UnitPrice");113

114
6、修改DataTable内容115

116
①、添加新DataRow117

118
DataRow row = ds.Tables["Customers"].NewRow();119

120
row["CustomerID"] = "ALFKI";121

122
ds.Tables["Customers"].Rows.Add(row);123

124
125

126
object[] aValues ={"ALFKI","Alfreds","Anders","030-22222"};127

128
da.Tables["Customers"].LoadDataRow(aValues,false);129

130
②、修改当前行131

132
修改行的内容逼供内不会自动修改数据库中相应的内容,对行所做的修改被视为是随后将使用SqlDataAdapter对象来提交交给数据库的待定的更改。133

134
DataRow rowCustomer;135

136
rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON");137

138
if(rowCustomer == null)139

140
//没有查找客户141

142
else143

144
{145

146
rowCustomer["CompanyName"] ="NewCompanyName"; 147

148
rowCustomer["ContactName"] ="NewContactName";149

150
}151

152
153

154
//推荐使用这种方式155

156
DataRow rowCustomer;157

158
rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON");159

160
if(rowCustomer == null)161

162
//没有查找客户163

164
else165

166
{167

168
rowCustomer.BeginEdit();169

170
rowCustomer["CompanyName"] ="NewCompanyName"; 171

172
rowCustomer["ContactName"] ="NewContactName";173

174
rowCustomer.EndEdit();175

176
}177

178
179

180
//null表示不修改该列的数据181

182
obejct[] aCustomer ={null,"NewCompanyName","NewContactName",null}183

184
DataRow rowCustomer;185

186
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");187

188
rowCustomer.ItemArray = aCustomer;189

190
③、处理DataRow的空值191

192
//查看是否为空193

194
DataRow rowCustomer;195

196
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");197

198
if(rowCustomer.IsNull("Phone"))199

200
Console.WriteLine("It's Null");201

202
else203

204
Console.WriteLine("It's not Null");205

206
207

208
//赋予空值209

210
rowCustomer["Phone"] = DBNull.Value;211

212
④、删除DataRow213

214
DataRow rowCustomer;215

216
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");217

218
rowCustomer.Delete();219

220
⑤、清除DataRow221

222
DataRow rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");223

224
rowCustomer.ItemArray = aCustomer;225

226
da.Tables["Customers"].Remove(rowCustomer);227

228
或者229

230
ds.Tables["Customers"].RemoveAt(intIndex);231

232
⑥、使用DataRow.RowState属性 :Unchanged,Detached,Added,Modified,Deleted233

234
private void DemonstrateRowState()235

236
{237
// Run a function to create a DataTable with one column.238
DataTable myTable = MakeTable();239
DataRow myRow;240

241
// Create a new DataRow.242
myRow = myTable.NewRow();243
// Detached row.244
Console.WriteLine("New Row " + myRow.RowState);245

246
myTable.Rows.Add(myRow);247
// New row.248
Console.WriteLine("AddRow " + myRow.RowState);249

250
myTable.AcceptChanges();251
// Unchanged row.252
Console.WriteLine("AcceptChanges " + myRow.RowState);253

254
myRow["FirstName"] = "Scott";255
// Modified row.256
Console.WriteLine("Modified " + myRow.RowState);257

258
myRow.Delete();259
// Deleted row.260
Console.WriteLine("Deleted " + myRow.RowState);261
}262

263
⑦、检查DataRow中的挂起更改264

265
DataRow rowCustomer;266

267
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");268

269
rowCustomer["CompanyName"] = "NewCompanyName";270

271
string strNewCompanyName,strOldCompanyName;272

273
Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Current]); 274

275
Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Original]);276

277
三、属性方法事件介绍 278

279
1、DataSet280

281
①、属性282

283
CaseSensitive:用于控制DataTable中的字符串比较是否区分大小写。284

285
DataSetName:当前DataSet的名称。如果不指定,则该属性值设置为"NewDataSet"。如果将DataSet内容写入XML文件,DataSetName是XML文件的根节点名称。286

287
DesignMode:如果在设计时使用组件中的DataSet,DesignMode返回True,否则返回False。288

289
HasErrors:表示DataSet中的DataRow对象是否包含错误。如果将一批更改提交给数据库并将DataAdapter对象的ContinueUpdateOnError属性设置为True,则在提交更改后必须检查DataSet的HasErrors属性,以确定是否有更新失败。290

291
NameSpace和Prefix:指定XML命名空间和前缀292

293
Relations:返回一个DataRelationCollection对象。294

295
Tables:检查现有的DataTable对象。通过索引访问DataTable有更好的性能。296

297
②、方法298

299
AcceptChanges和RejectChanges:接受或放弃DataSet中所有挂起更改。调用AcceptChanges时,RowState属性值为Added或Modified的所有行的RowState属性都将被设置为UnChanged.任何标记为Deleted的DataRow对象将从DataSet中删除。调用RejectChanges时,任何标记为Added的DataRow对象将会被从DataSet中删除,其他修改过的DatRow对象将返回前一状态。300

301
Clear:清除DataSet中所有DataRow对象。该方法比释放一个DataSet然后再创建一个相同结构的新DataSet要快。302

303
Clone和Copy:使用Copy方法会创建与原DataSet具有相同结构和相同行的新DataSet。使用Clone方法会创建具有相同结构的新DataSet,但不包含任何行。304

305
GetChanges:返回与原DataSet对象具有相同结构的新DataSet,并且还包含原DataSet中所有挂起更改的行。306

307
GetXml和GetXmlSchema:使用GetXml方法得到由DataSet的内容与她的架构信息转换为XML格式后的字符串。如果只希望返回架构信息,可以使用GetXmlSchema。308

309
HasChange:表示DataSet中是否包含挂起更改的DataRow对象。310

311
Merge:从另一个DataSet、DataTable或现有DataSet中的一组DataRow对象载入数据。312

313
ReadXml和WriteXml:使用ReadXml方法从文件、TextReader、数据流或者XmlReader中将XML数据载入DataSet中。314

315
Reset:将DataSet返回为未初始化状态。如果想放弃现有DataSet并且开始处理新的DataSet,使用Reset方法比创建一个DataSet的新实例好。316

317
③、事件318

319
MergeFailed:在DataSet的Merge方法发生一个异常时触发。320

321
2、DataTable322

323
①、属性324

325
②、方法326

327
③、事件328

329
ColumnChanged:在列的内容被改变之后触发330

331
ColumnChangding:在列的内容被改变之前触发332

333
RowChanged,RowChanging,RowDeleted,RowDeleting。334

335
3、DataColumn336

337
①、属性338

339
4、DataRow340

341
①、属性342

343
HasError:确定行是否包含错误。344

345
Item:通过指定行的列数,列的名称或DataColumn对象本身,访问列的内容。346

347
ItemArray:获取或设置行中所有列的值。348

349
RowError:返回一个包含行错误信息的字符串。350

351
RowState:返回DataRowState枚举中的值来表示行的当前状态。352

353
Table:返回DataRow对象所在的DataTable。354

355
②、方法356

357
AcceptChanges和RejectChanges:提交和放弃挂起更改。358

359
BeginEdit、CancelEdit、EndEdit360

361
ClearErrors:清除DataRow中所有的错误。362

363
Delete:Delete方法实际上并不从DataRow表的Row集合中删除该DataRow。当调用DataRow对象的Delete方法时,ADO.NET将该行标记为删除,之后调用SqlDataAdapter对象的Update方法来删除其在数据库中对应的行。364

365
如果希望彻底删除DataRow,可以调用Delete方法,接着再调用它的AccepteChanges方法,还可以使用DataRowCollection对象的Remove方法完成相同的任务。366

367
浅谈DataSet 的用法368
DataSet是ADO.NET开发人员为方便数据处理开发出来的,是数据的集合,是为解决DataReader的缺陷设计的,DataReader数据处理速度快,但它是只读的, 而且一旦移到下一行,就不能查看上一行的数据,DataSet则可以自由移动指针。DataSet的数据是与数据库断开的。DataSet还可用于多层应用程序中,如果应用程序运行在中间层的业务对象中来访问数据库,则业务对象需将脱机数据结构传递给客户应用程序。 369

370
DataSet的功能:浏览、排序、搜索、过滤、处理分级数据、缓存更改等。还可以与XML数据互换。DataSet中可包括多个DataTable,可将多个查询结构存到一个DataSet中,方便操作,而DataTable中又包括多个DataRow、DataColumn,可通过这些DataRow、DataColumn来查看、操作其中的数据,而需将操作结果返回给数据库的话,则可以调用DataAdapter的Update方法。371

372
DataSet的操作:373

374
DataSet ds=new DataSet();375
DataTable dt=new DataTable("newTable");376
ds.Tables.Add(dt);DataSet ds=new DataSet();377
DataTable dt=ds.Tables.Add("newTable");378
上述两种方法都可以在DataSet中添加一个DataTable,看需要而进行选择。添加DataTable后,需向其中添加行和列。379

380
DataSet ds=new DataSet();381
DataTable dt=ds.Tables.Add("newTables");382
DataColumn col=dt.Columns.Add("newColumn",typeof(int));383
col.AllowDBNull=false;384
col.MaxLength=4;385
col.Unique=true;386

387
上述代码向DataSet中的DataTable中添加名为”newColumn”,类型为int且不为空,最大长度为4和唯一性为真的列。388

389
dt.PrimaryKey=new DataColumn[]{dt.Columns["ID"]}390
这段代码是继续上面代码的,为一个DataTable中添加一个主键列,主键列是一个数据组,如有多个主键,只需在数组中添加一个列即可。如下:391

392
dt.PrimaryKey=new DataColumns[]{dt.Columns["OrderID"],dt.Columns["ProductID"]}393
添加外键:394

395
ForeignKeyConstraint fk;396
fk=new ForeignKeyConstraint(ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]);397
ds.Tables["Orders"].Constraints.Add(fk);398
//上述代码假如已经为Cusomers表和Orders创建了主键,此句为添加外键约束。399
上述是根据Customers表和Orders表的CustomerID来创建约束。400

401
下面介绍修改DataRow中的内容:402

403
DataRow dr=ds.Tables["Customer"].Rows.Find("ANTON");404
if(dr==null)405

406
else407
{408
dr.BeginEdit(); 409
dr["CompanyName"]="newValue";410
dr["ContactName"]="newValue2";411
dr.EndEdit();412
}413
//上面代码通过Row集合的Find方法来在DataTable中的行进行定位,找到"ANTON"行,再修改"ANTON"行中CompanyName列和ContactName列的值。通过BeginEdit和EndEdit来缓存对行的修改,还可调用 CancelEdit为取消修改。414
判断某列是否为空值: 415

416
417

418
DataRow dr=ds.Tables["Customers"].Rows.Find("aaa");419
if(dr.IsNull("ContactName");420
..421
else422
dr["ContactName"]=DBNull.Value423
//这里判断ContactName列是否为空,如果不是则为其赋空值,呵,很无厘头的做法,这里只为演示为列赋空值的做法。424
删除DataRow:425

426
有两种方法可以删除DataRow,Delete方法和Remove方法和RemoveAt方法。其区别是Delete方法实际上不是从DataTable中删除掉一行,而是将其标志为删除,仅仅是做个记号,而Remove方法则是真正的从DataRow中删除一行,RemoveAt方法是根本行的索引来删除。列:427

428
DataRow dr=ds.Tables["table"].Rows.Find("a");429
ds.Tables["table"].Remove(dr);430
或431
ds.Tables["table"].Remove(index);432
//dr 为"a"所在的行,查出后将其删除,index为 "a"所在的索引号。关于DataSet中的其用法,参照MSDN 433

434
435

436
DataRow dr=ds.Tables["Customers"].Rows.Find("aaa");437
if(dr.IsNull("ContactName");438
..439
else440
dr["ContactName"]=DBNull.Value441
//这里判断ContactName列是否为空,如果不是则为其赋空值,呵,很无厘头的做法,这里只为演示为列赋空值的做法。
tbl.PrimaryKey 
浙公网安备 33010602011771号