About the Authors |
|
xxi | |
About the Technical Reviewer |
|
xxiii | |
Acknowledgments |
|
xxv | |
Introduction |
|
xxvii | |
|
|
1 | (32) |
|
Overview of Microsoft Data Access Technologies |
|
|
2 | (5) |
|
|
2 | (2) |
|
|
4 | (1) |
|
|
5 | (1) |
|
|
5 | (1) |
|
|
5 | (1) |
|
|
6 | (1) |
|
|
6 | (1) |
|
|
7 | (1) |
|
|
8 | (1) |
|
|
9 | (2) |
|
Single Object-Oriented API |
|
|
9 | (1) |
|
|
10 | (1) |
|
|
10 | (1) |
|
|
11 | (1) |
|
Performance and Scalability |
|
|
11 | (1) |
|
Comparing ADO.NET and ADO |
|
|
11 | (2) |
|
Connections and Disconnected Data |
|
|
11 | (1) |
|
|
12 | (1) |
|
|
12 | (1) |
|
Overview of ADO.NET Namespaces and Classes |
|
|
13 | (2) |
|
Understanding ADO.NET Components |
|
|
15 | (7) |
|
|
16 | (1) |
|
|
17 | (2) |
|
|
19 | (1) |
|
|
19 | (1) |
|
|
20 | (1) |
|
|
21 | (1) |
|
Writing ADO.NET Applications |
|
|
22 | (4) |
|
Choosing a .NET Data Provider |
|
|
22 | (1) |
|
Adding Namespace References |
|
|
23 | (1) |
|
Establishing a Connection |
|
|
24 | (1) |
|
Creating a Command or DataAdapter Object |
|
|
25 | (1) |
|
Filling Data to a DataSet or DataReader Object |
|
|
25 | (1) |
|
|
25 | (1) |
|
|
26 | (1) |
|
Creating a Simple ADO.NET Application |
|
|
26 | (2) |
|
Using a DataSet to Read Data |
|
|
28 | (3) |
|
|
31 | (2) |
|
Data Components in Visual Studio .NET |
|
|
33 | (40) |
|
Creating an ADO.NET Project |
|
|
33 | (1) |
|
Using the Server Explorer |
|
|
34 | (3) |
|
|
35 | (1) |
|
Managing and Viewing Data |
|
|
36 | (1) |
|
Using Visual Data Components |
|
|
37 | (14) |
|
Understanding Data Connections |
|
|
38 | (2) |
|
Understanding Connection Strings |
|
|
40 | (1) |
|
Working with SQL DataAdapters |
|
|
40 | (11) |
|
Using DataSet and DataView Components |
|
|
51 | (6) |
|
Understanding Typed DataSets in VS .NET |
|
|
51 | (3) |
|
Understanding the DataView |
|
|
54 | (3) |
|
Using the Data Form Wizard |
|
|
57 | (14) |
|
Data Form Wizard: Looking under the Hood |
|
|
66 | (1) |
|
|
67 | (1) |
|
Understanding DataForm1.vb |
|
|
67 | (4) |
|
|
71 | (2) |
|
ADO.NET in Disconnected Environments |
|
|
73 | (62) |
|
Understanding the ADO.NET Architecture |
|
|
75 | (1) |
|
Exploring the ADO.NET Class Hierarchy |
|
|
76 | (4) |
|
|
80 | (1) |
|
Understanding ADO.NET Disconnected Classes |
|
|
81 | (2) |
|
The System.Data Namespace |
|
|
81 | (1) |
|
The System.Data.Common Namespace |
|
|
82 | (1) |
|
|
83 | (37) |
|
|
85 | (9) |
|
|
94 | (5) |
|
|
99 | (1) |
|
|
100 | (6) |
|
More DataTable Operations |
|
|
106 | (9) |
|
The Row and Column Collections |
|
|
115 | (2) |
|
The DataRow States and Versions |
|
|
117 | (3) |
|
Using DataSet, DataView, and DataViewManager |
|
|
120 | (13) |
|
The DataSet: The Heart of ADO.NET |
|
|
121 | (6) |
|
Typed and Untyped DataSets |
|
|
127 | (1) |
|
|
128 | (4) |
|
|
132 | (1) |
|
|
133 | (2) |
|
ADO.NET in Connected Environments |
|
|
135 | (74) |
|
Understanding the Generic Data Provider Model |
|
|
135 | (2) |
|
|
137 | (1) |
|
Exploring the System.SqlClient Namespace |
|
|
137 | (2) |
|
The Connection: Connecting to a Data Source |
|
|
139 | (11) |
|
|
139 | (1) |
|
Understanding the Connection Properties and Methods |
|
|
140 | (2) |
|
Opening and Closing a Connection |
|
|
142 | (3) |
|
Understanding Connection Pooling |
|
|
145 | (4) |
|
Using the CreateCommand and ChangeDatabase Methods |
|
|
149 | (1) |
|
The Command: Executing SQL Statements |
|
|
150 | (10) |
|
Creating a Command Object |
|
|
151 | (2) |
|
Creating and Using OleDbCommand |
|
|
153 | (1) |
|
Using the CommandType Enumeration |
|
|
154 | (1) |
|
Calling a Stored Procedure |
|
|
155 | (2) |
|
|
157 | (1) |
|
|
158 | (2) |
|
Using Other Command Methods |
|
|
160 | (1) |
|
The DataReader: Walking through the Data |
|
|
160 | (6) |
|
Initializing a DataReader |
|
|
161 | (1) |
|
Understanding DataReader Properties and Methods |
|
|
161 | (1) |
|
Reading with the DataReader |
|
|
162 | (2) |
|
Interpreting Batches of Queries |
|
|
164 | (1) |
|
Understanding Command Behaviors |
|
|
165 | (1) |
|
The DataAdapter: Adapting to Your Environment |
|
|
166 | (15) |
|
Constructing a DataAdapter Object |
|
|
166 | (2) |
|
Understanding DataAdapter Properties |
|
|
168 | (2) |
|
Understanding DataAdapter Methods |
|
|
170 | (1) |
|
|
170 | (2) |
|
Adding a DataTable to a DataSet |
|
|
172 | (1) |
|
Looking at a DataAdapter Example |
|
|
172 | (3) |
|
Filling the DataAdapter from a Recordset |
|
|
175 | (1) |
|
Updating the Database Using the Update Method |
|
|
176 | (2) |
|
|
178 | (3) |
|
CommandBuilder: Easing the Work of Programmers |
|
|
181 | (3) |
|
Creating a CommandBuilder Object |
|
|
182 | (1) |
|
Using SqlCommandBuilder Members |
|
|
182 | (1) |
|
|
182 | (2) |
|
Staying within the Parameters |
|
|
184 | (4) |
|
The DataSet in Connected Environments |
|
|
188 | (6) |
|
Filling a DataSet from Multiple Tables |
|
|
188 | (2) |
|
Using a SQL Statement to Read Data from Two or More Tables |
|
|
190 | (1) |
|
Adding, Updating, and Deleting Data through the DataSet |
|
|
190 | (1) |
|
Accepting and Rejecting Changes through the DataSet |
|
|
191 | (1) |
|
|
192 | (1) |
|
Using a DataSet vs. Using a DataReader |
|
|
193 | (1) |
|
Fetching Data Based on Wildcard Characters |
|
|
194 | (1) |
|
The DataView in Connected Environments |
|
|
194 | (14) |
|
|
195 | (5) |
|
Using Transactions in ADO.NET |
|
|
200 | (1) |
|
Using Concurrency in ADO.NET |
|
|
201 | (3) |
|
Understanding Rollback, Commit, and Savepoints |
|
|
204 | (2) |
|
|
206 | (2) |
|
|
208 | (1) |
|
|
209 | (24) |
|
Working with Connection Events |
|
|
211 | (4) |
|
Working with DataAdapter Events |
|
|
215 | (5) |
|
Working with DataSet Events |
|
|
220 | (1) |
|
Working with DataTable Events |
|
|
221 | (5) |
|
Working with XmlDataDocument Events |
|
|
226 | (3) |
|
Working with DataView and DataViewManager Events |
|
|
229 | (2) |
|
|
231 | (2) |
|
Integrating XML with ADO.NET |
|
|
233 | (54) |
|
Understanding Microsoft .NET and XML |
|
|
233 | (5) |
|
Using the System.Xml Namespace |
|
|
234 | (1) |
|
Using the System.Xml.Schema Namespace |
|
|
235 | (1) |
|
Using the System.Xml.Serialization Namespace |
|
|
236 | (1) |
|
Using the System.Xml.XPath Namespace |
|
|
236 | (1) |
|
Using the System.Xml.Xsl Namespace |
|
|
236 | (1) |
|
Using the Document Object Model Interfaces |
|
|
237 | (1) |
|
Looking at the XML .NET Architecture |
|
|
237 | (1) |
|
Adding a System.Xml Namespace Reference |
|
|
238 | (1) |
|
|
238 | (8) |
|
|
239 | (3) |
|
|
242 | (1) |
|
Using the GetAttributes of a Node |
|
|
243 | (1) |
|
|
244 | (1) |
|
|
245 | (1) |
|
Understanding the XmlWriter Classes |
|
|
246 | (5) |
|
Setting XmlWriter Properties |
|
|
247 | (1) |
|
|
247 | (1) |
|
Seeing XmlWriter in Action |
|
|
248 | (2) |
|
|
250 | (1) |
|
Using the XmlConvert Class |
|
|
251 | (1) |
|
Understanding the DOM Implementation |
|
|
251 | (9) |
|
|
252 | (1) |
|
Using the XmlDocument Class |
|
|
252 | (1) |
|
|
253 | (1) |
|
Using the XmlDocumentFragment Class |
|
|
253 | (1) |
|
Using the XmlElement Class |
|
|
254 | (5) |
|
Adding Attributes to a Node |
|
|
259 | (1) |
|
Understanding Transformation and XSLT |
|
|
260 | (2) |
|
Using the Transform Method |
|
|
261 | (1) |
|
|
261 | (1) |
|
Using ADO.NET and XML Together |
|
|
262 | (10) |
|
Reading XML Using a DataSet |
|
|
262 | (2) |
|
Writing XML Using a DataSet |
|
|
264 | (3) |
|
Using XmlDataDocument and XML |
|
|
267 | (3) |
|
Displaying XML Data in a DataSet Format |
|
|
270 | (1) |
|
Saving Data from a DataSet to XML |
|
|
271 | (1) |
|
XmlDataDocument: Looking under the Hood |
|
|
272 | (1) |
|
|
272 | (5) |
|
Using the XPathNavigator Class |
|
|
273 | (1) |
|
Using XPathNavigator Move Methods |
|
|
274 | (2) |
|
Searching Using XPathNavigator |
|
|
276 | (1) |
|
|
277 | (9) |
|
|
277 | (6) |
|
Adding Schema from a Database Objects |
|
|
283 | (2) |
|
Generating a Typed DataSet from a Schema |
|
|
285 | (1) |
|
|
286 | (1) |
|
Data Binding and Windows Forms Data-Bound Controls |
|
|
287 | (58) |
|
Understanding Data Binding |
|
|
287 | (14) |
|
|
288 | (5) |
|
Understanding the BindingManagerBase Functionality |
|
|
293 | (3) |
|
Understanding BindingContext |
|
|
296 | (1) |
|
Building a Record Navigation System |
|
|
296 | (5) |
|
Working with Complex Data-Bound Controls |
|
|
301 | (6) |
|
The Role of Control Class in Data Binding |
|
|
301 | (1) |
|
Using the ListControl Class |
|
|
301 | (1) |
|
ListControl DataBinding-Related Events |
|
|
302 | (2) |
|
Data Binding in ComboBox and ListBox Controls |
|
|
304 | (2) |
|
Data Binding in a DataGrid Control |
|
|
306 | (1) |
|
|
307 | (1) |
|
The DataGrid: Super Data-Bound Control |
|
|
307 | (37) |
|
Understanding the DataGrid Class Members |
|
|
309 | (3) |
|
Exploring the DataGrid Helper Objects |
|
|
312 | (1) |
|
Understanding the DataGrid and DataGrid Column Styles |
|
|
313 | (8) |
|
Seeing DataGridTableStyle and DataGridColumnStyle in Action |
|
|
321 | (3) |
|
|
324 | (10) |
|
Implementing Custom Sorting in a DataGrid |
|
|
334 | (1) |
|
Building a DataGrid Record Navigation System |
|
|
335 | (3) |
|
Implementing Search in a DataGrid |
|
|
338 | (4) |
|
Inserting, Updating, and Deleting Data through DataGrids |
|
|
342 | (2) |
|
|
344 | (1) |
|
Constraints and Data Relations |
|
|
345 | (14) |
|
Understanding Constraints |
|
|
345 | (8) |
|
Implementing the Constraint Classes |
|
|
346 | (1) |
|
Implementing the ForeignKeyConstraint Class |
|
|
346 | (7) |
|
Understanding Data Relations |
|
|
353 | (1) |
|
Understanding the DataRelation and DataRelationCollection Objects |
|
|
354 | (4) |
|
|
358 | (1) |
|
ADO.NET Exception Handling |
|
|
359 | (16) |
|
Why Use Exception Handling? |
|
|
360 | (5) |
|
Using Try...Catch Statements |
|
|
361 | (1) |
|
Using Try...Catch...Finally Statements |
|
|
362 | (1) |
|
Nesting Try...Catch Statements |
|
|
363 | (1) |
|
Using Try with Multiple Catch Statements |
|
|
363 | (1) |
|
Defining Custom Filters and Error Messages |
|
|
364 | (1) |
|
Understanding the Exception Classes |
|
|
365 | (1) |
|
Using the Exception Class: Mother of All Exceptions |
|
|
365 | (1) |
|
Understanding Other Exception Classes |
|
|
366 | (1) |
|
Exception Handling in ADO.NET |
|
|
366 | (8) |
|
Recognizing SQL Server 2000 Errors |
|
|
368 | (2) |
|
Using SQL Server Error Logs |
|
|
370 | (1) |
|
Using the SqlException Class |
|
|
371 | (2) |
|
Using the SqlError and SqlErrorCollection Classes |
|
|
373 | (1) |
|
|
374 | (1) |
|
Working with the ODBC .NET Data Provider |
|
|
375 | (18) |
|
Using the ODBC .NET Data Provider |
|
|
375 | (3) |
|
Installing the ODBC .NET Data Provider |
|
|
376 | (1) |
|
Understanding the ODBC.NET Data Provider |
|
|
377 | (1) |
|
Accessing Access Databases |
|
|
378 | (2) |
|
Accessing MySOL Databases |
|
|
380 | (1) |
|
Accessing MySOL Databases |
|
|
381 | (1) |
|
Accessing Text File Databases |
|
|
382 | (7) |
|
Exporting an Access Table to a Text File |
|
|
383 | (2) |
|
|
385 | (4) |
|
Accessing Excel Databases |
|
|
389 | (2) |
|
Implementing Two .NET 1.1 Updates |
|
|
391 | (1) |
|
|
391 | (2) |
|
Stored Procedures and Views |
|
|
393 | (20) |
|
Working with Stored Procedures |
|
|
393 | (12) |
|
Creating a Stored Procedure |
|
|
393 | (4) |
|
Executing a Stored Procedure from VS .NET |
|
|
397 | (2) |
|
Executing a Stored Procedure Programmatically |
|
|
399 | (6) |
|
Understanding SOL Injection |
|
|
405 | (1) |
|
|
406 | (5) |
|
|
406 | (3) |
|
Executing a View from VS .NET |
|
|
409 | (1) |
|
Retrieving Data from a View Programmatically |
|
|
409 | (2) |
|
Filling a DataSet from Multiple Views |
|
|
411 | (1) |
|
|
411 | (2) |
|
Oracle, SQLXML, and Other .NET Data Providers |
|
|
413 | (24) |
|
Using Oracle .NET Data Providers |
|
|
413 | (13) |
|
Adding a Reference to the Oracle .NET Data Provider |
|
|
415 | (1) |
|
Using the Oracle .NET Data Provider Classes |
|
|
416 | (10) |
|
Using the SOLXML and SOL XML .NET Data Providers |
|
|
426 | (9) |
|
Using the FOR XML Keyword |
|
|
427 | (1) |
|
Using the SqlXmlAdapter Object |
|
|
428 | (1) |
|
Using the SqlXmlParameter Object |
|
|
429 | (1) |
|
Using the SqlXmlCommand Object |
|
|
430 | (5) |
|
Using a MySOL Database and the .NET Data Provider |
|
|
435 | (1) |
|
|
435 | (2) |
|
Developing a Custom Data Provider |
|
|
437 | (28) |
|
Overview of the Data Provider Interfaces |
|
|
438 | (8) |
|
Understanding the Connection Object |
|
|
439 | (1) |
|
Understanding the Command Object |
|
|
440 | (1) |
|
Understanding the Reader Object |
|
|
441 | (2) |
|
Understanding the Adapter Object |
|
|
443 | (3) |
|
Building a Custom Data Provider |
|
|
446 | (18) |
|
Creating the PipedDataConnection Object |
|
|
446 | (3) |
|
Creating the PipedDataCommand Object |
|
|
449 | (4) |
|
Creating the PipedDataReader Object |
|
|
453 | (7) |
|
Creating the PipedDataAdapter Object |
|
|
460 | (2) |
|
Testing the PipedDataProvider Application |
|
|
462 | (2) |
|
Debugging Your Custom Data Provider |
|
|
464 | (1) |
|
|
464 | (1) |
|
Developing Database Web Applications Using ASP.NET |
|
|
465 | (52) |
|
|
465 | (3) |
|
ASP.NET Platform Requirements |
|
|
466 | (1) |
|
|
466 | (1) |
|
|
466 | (1) |
|
|
466 | (1) |
|
ASP.NET: An Evolution of ASP |
|
|
467 | (1) |
|
Web Forms and Web Services |
|
|
468 | (1) |
|
Developing Your First ASP.NET Web Application |
|
|
468 | (10) |
|
Creating a Web Application Project |
|
|
469 | (3) |
|
Adding Web Controls to a Web Form |
|
|
472 | (2) |
|
Setting Control Properties |
|
|
474 | (1) |
|
|
475 | (2) |
|
Writing Code on the Button Click Event Handler |
|
|
477 | (1) |
|
Creating Your First ADO.NET Web Application |
|
|
478 | (2) |
|
Using ASP.NET Server-Side Controls |
|
|
480 | (7) |
|
|
481 | (1) |
|
|
482 | (1) |
|
|
483 | (1) |
|
Server Controls and the .NET Framework Library |
|
|
483 | (2) |
|
Why Are Web Forms Controls Called Server-Side Controls? |
|
|
485 | (1) |
|
Adding Server-Side Controls to a Web Form |
|
|
485 | (2) |
|
Understanding Data Binding in ASP.NET |
|
|
487 | (20) |
|
|
488 | (2) |
|
DataGrid and DataList Controls |
|
|
490 | (9) |
|
Paging in the DataGrid Control |
|
|
499 | (1) |
|
Enabling Paging Programmatically |
|
|
500 | (2) |
|
Adding, Editing, and Deleting Data in Web Forms |
|
|
502 | (3) |
|
|
505 | (1) |
|
|
506 | (1) |
|
|
507 | (1) |
|
Creating a Guest Book in ASP.NET |
|
|
507 | (9) |
|
Default Web Form: MyGuestBook.aspx |
|
|
508 | (3) |
|
Adding Forms to the Guest Book |
|
|
511 | (3) |
|
Compiling and Running the Guest Book Project |
|
|
514 | (2) |
|
|
516 | (1) |
|
Using ADO.NET in XML Web Services |
|
|
517 | (20) |
|
Exploring Web Services and the .NET Framework Library |
|
|
518 | (1) |
|
Creating a Web Service in VS .NET |
|
|
518 | (3) |
|
|
521 | (3) |
|
Creating the Web Service Consumer |
|
|
524 | (11) |
|
Adding Data to a Database Through a Web Service |
|
|
529 | (5) |
|
Adding More Functionality to the Web Service |
|
|
534 | (1) |
|
|
535 | (2) |
|
ASP.NET Server Controls and Data Binding |
|
|
537 | (72) |
|
Data Binding in Web Forms, Revisited |
|
|
537 | (3) |
|
|
537 | (1) |
|
Simple and Complex Data Binding |
|
|
538 | (1) |
|
The Roles of the Control and Page Classes in Data Binding |
|
|
539 | (1) |
|
Data Binding in Simple Web Forms Controls |
|
|
540 | (22) |
|
|
540 | (2) |
|
Using the Calendar Control |
|
|
542 | (4) |
|
Understanding Web Server Control Templates |
|
|
546 | (6) |
|
Using the Repeater Control |
|
|
552 | (3) |
|
Understanding the Role of the ListControl Class |
|
|
555 | (1) |
|
Using the ListBox Control |
|
|
556 | (2) |
|
Using the DropDownList Control |
|
|
558 | (2) |
|
Data Binding in Other Simple Controls |
|
|
560 | (2) |
|
Data Binding in Complex Web Forms Controls |
|
|
562 | (46) |
|
Understanding the BaseDataList Class |
|
|
562 | (1) |
|
Using the DataKeyCollection Class |
|
|
563 | (1) |
|
Using the DataList Web Server Control |
|
|
564 | (18) |
|
Using the DataGrid Web Server Control |
|
|
582 | (26) |
|
|
608 | (1) |
|
Building Real-World Web Applications |
|
|
609 | (28) |
|
Introducing the Job Board Application Specifications |
|
|
609 | (1) |
|
Understanding the Database Schema |
|
|
610 | (1) |
|
Developing the Online Job Board Application |
|
|
611 | (24) |
|
Creating the Login.aspx Page |
|
|
612 | (3) |
|
Creating the Register.aspx Page |
|
|
615 | (2) |
|
Creating the Contact.aspx Page |
|
|
617 | (1) |
|
Creating the PostJob.aspx Page |
|
|
618 | (2) |
|
Creating the PostResume.aspx Page |
|
|
620 | (3) |
|
Creating the DisplayData.aspx and Resumes.aspx Pages |
|
|
623 | (9) |
|
Creating the dnjHeader.aspx Page |
|
|
632 | (1) |
|
|
633 | (2) |
|
Improving and Modifying the Application |
|
|
635 | (1) |
|
|
636 | (1) |
|
Object-Relational Mapping in .NET |
|
|
637 | (38) |
|
Why Not Just Use a DataSet? |
|
|
638 | (1) |
|
Understanding Object Databases |
|
|
639 | (1) |
|
Why Object Relational Mapping? |
|
|
640 | (1) |
|
Creating the Basic Design of the Video Store Application |
|
|
640 | (25) |
|
Understanding the Basic Architecture |
|
|
641 | (1) |
|
Creating the Database Design of the Video Store |
|
|
641 | (2) |
|
|
643 | (1) |
|
Creating the Mapped Object |
|
|
644 | (4) |
|
Creating the Data Access Component |
|
|
648 | (4) |
|
Building the VideoTape Test Case |
|
|
652 | (2) |
|
|
654 | (5) |
|
Creating the User Test Case |
|
|
659 | (2) |
|
|
661 | (2) |
|
Creating the Check In/Check Out Component |
|
|
663 | (1) |
|
|
664 | (1) |
|
|
665 | (8) |
|
Understanding Logic in Stored Procedures |
|
|
665 | (1) |
|
Understanding Component Isolation |
|
|
666 | (1) |
|
Creating a Workaround on Part of the Problem |
|
|
667 | (3) |
|
Creating the VideoCheckInCheckOut Test Case |
|
|
670 | (3) |
|
|
673 | (2) |
|
Mapped Objects: Performance Considerations and Data Binding |
|
|
675 | (34) |
|
Using Data Binding and Mapped Objects |
|
|
675 | (9) |
|
Directly Accessing a Bound Object's Properties |
|
|
678 | (2) |
|
Using Logic with Bound Objects |
|
|
680 | (4) |
|
Understanding Problematic Master-Detail Relationships |
|
|
684 | (10) |
|
Working with Highly Nested Structures |
|
|
685 | (6) |
|
Working with a Much Larger Tree |
|
|
691 | (2) |
|
A Final Note on Tree Optimization |
|
|
693 | (1) |
|
Working with Large Master-Detail Relationships |
|
|
694 | (12) |
|
Implementing Lazy Loading |
|
|
695 | (5) |
|
Implementing an Incremental Lazy Loading Scheme |
|
|
700 | (5) |
|
Loading the Detail When the Master Is Loaded |
|
|
705 | (1) |
|
Using a Near-Zero-Impact Caching Mechanism |
|
|
706 | (2) |
|
|
708 | (1) |
|
COM Interoperability and ADO.NET |
|
|
709 | (16) |
|
Exploring the .NET Interop Tools |
|
|
710 | (2) |
|
|
710 | (1) |
|
Using the Type Library Importer and Exporter (Tlbimp.exe) |
|
|
711 | (1) |
|
Using the Type Library Exporter (Tlbexp.exe) |
|
|
712 | (1) |
|
Using the ADO Recordset in ADO.NET |
|
|
712 | (4) |
|
|
716 | (2) |
|
Accessing OLAP Server Data with ADO.NET |
|
|
718 | (6) |
|
|
724 | (1) |
|
|
725 | (28) |
|
Introducing Types of Queues |
|
|
725 | (1) |
|
|
726 | (1) |
|
|
726 | (1) |
|
Installing Message Queuing |
|
|
726 | (1) |
|
Using the System.Messaging Namespace |
|
|
727 | (2) |
|
Working with Message Queues |
|
|
729 | (7) |
|
Using the MessageQueue Properties |
|
|
729 | (2) |
|
Managing Queues Using VS .NET |
|
|
731 | (1) |
|
Retrieving Available Queues |
|
|
732 | (2) |
|
Filtering Queues Using MessageQueueCriteria |
|
|
734 | (1) |
|
Creating and Deleting Message Queues Programmatically |
|
|
735 | (1) |
|
Creating a Sample Application |
|
|
736 | (9) |
|
Creating a MessageQueue Instance |
|
|
738 | (1) |
|
|
739 | (1) |
|
Sending and Receiving Messages |
|
|
740 | (1) |
|
Walking Through Simple Messaging Application |
|
|
741 | (4) |
|
|
745 | (2) |
|
Creating and Removing Messages |
|
|
745 | (1) |
|
Setting Queue and Message Priorities |
|
|
746 | (1) |
|
Understanding Transactional Messaging |
|
|
747 | (3) |
|
Using the MessageQueueTransaction Class |
|
|
747 | (1) |
|
Creating Transactional Queues |
|
|
748 | (1) |
|
Sending and Receiving Transactional Messages |
|
|
748 | (2) |
|
|
750 | (2) |
|
|
752 | (1) |
|
SQL Server and ADO.NET: Notes on Performance |
|
|
753 | (26) |
|
Improving SOL Server Performance |
|
|
753 | (16) |
|
|
753 | (4) |
|
Choosing Which Columns to Index |
|
|
757 | (1) |
|
Understanding the SQL Server Profiler |
|
|
758 | (2) |
|
Optimizing Automatically with the SQL Server Profiler |
|
|
760 | (2) |
|
Optimizing Your Transact-SQL Queries for Performance |
|
|
762 | (3) |
|
Avoiding Excessive Stored Procedure Recompilation |
|
|
765 | (1) |
|
|
766 | (1) |
|
Designing Your Tables for Optimal Performance |
|
|
766 | (1) |
|
Checking the Size of Database Pages |
|
|
767 | (1) |
|
Understanding Denormalization |
|
|
768 | (1) |
|
Understanding the Dangers of Database Design Slippage |
|
|
768 | (1) |
|
Understanding ADO.NET Performance Issues and Using Best Practices |
|
|
769 | (9) |
|
|
769 | (1) |
|
Writing a Generic Data Access Component |
|
|
770 | (5) |
|
Choosing a Development Mode: Designer vs. Manual |
|
|
775 | (1) |
|
Retrieving Data: DataReader, XmlReader, and DataSet |
|
|
775 | (1) |
|
Updating a Data Source: Command vs. DataSet |
|
|
776 | (1) |
|
Saving Data and Using GetChanges |
|
|
777 | (1) |
|
Retrieving Data with the SELECT Statement |
|
|
777 | (1) |
|
|
777 | (1) |
|
Using Connection Strings and Pooling |
|
|
777 | (1) |
|
|
778 | (1) |
|
Appendix A Relational Databases: Some Basic Concepts |
|
|
779 | (14) |
|
Understanding Normalization |
|
|
780 | (6) |
|
|
780 | (2) |
|
|
782 | (2) |
|
|
784 | (1) |
|
Boyce-Codd Normal Form (BCNF) |
|
|
785 | (1) |
|
|
785 | (1) |
|
Fifth Normal Form (5NF or PJ/NF) |
|
|
786 | (1) |
|
Introducing Sets, Cursors, and ADO.NET |
|
|
786 | (2) |
|
|
788 | (4) |
|
|
788 | (2) |
|
|
790 | (2) |
|
|
792 | (1) |
|
Appendix B Commonly Used SOL Statements |
|
|
793 | (18) |
|
Understanding SOL References |
|
|
793 | (14) |
|
Using the SELECT Statement |
|
|
796 | (6) |
|
Using the UPDATE Statement |
|
|
802 | (1) |
|
Using the DELETE Statement |
|
|
802 | (1) |
|
Using the CREATE TABLE Statement |
|
|
803 | (1) |
|
Using the DROP TABLE Statement |
|
|
803 | (1) |
|
Using the TRUNCATE TABLE Statement |
|
|
804 | (1) |
|
Using the INSERT Statement |
|
|
805 | (1) |
|
|
806 | (1) |
|
|
807 | (2) |
|
Using SOL Server's SELECT...FOR XML Clause |
|
|
809 | (1) |
|
|
810 | (1) |
|
Appendix C ADO.NET Frequently Asked Questions |
|
|
811 | (36) |
|
|
845 | (2) |
Index |
|
847 | |