| Foreword | p. ix |
| About the Author | p. xi |
| About the Technical Reviewer | p. xiii |
| Acknowledgments | p. xv |
| Introduction | p. xvii |
| Getting Started | p. 1 |
| A Lightning-Quick Introduction to C# | p. 3 |
| Reviewing Programming Concepts | p. 4 |
| Getting Cozy with the VS .NET Integrated Development Environment | p. 14 |
| Summary | p. 28 |
| Database Programming | p. 29 |
| Using Databases | p. 31 |
| What Is a Database? | p. 31 |
| Why Use a Database? | p. 32 |
| Relational vs. Hierarchical | p. 33 |
| What C# Programmers Need to Know About Relational Databases | p. 35 |
| UserMan Database Schema | p. 51 |
| Summary | p. 53 |
| Presenting ADO.NET: The Connected Layer | p. 55 |
| Data-Related Namespaces | p. 58 |
| Data Providers and Drivers | p. 59 |
| Using Command Objects | p. 123 |
| Using the DataReader Class | p. 146 |
| The DataAdapter Explained | p. 170 |
| Using the CommandBuilder Class | p. 188 |
| Summary | p. 191 |
| Presenting ADO.NET: The Disconnected Layer | p. 193 |
| Using the DataSet Class | p. 193 |
| Using the DataTable Class | p. 218 |
| Using the DataView Class | p. 238 |
| Using the DataRow Class | p. 245 |
| Using the DataColumn Class | p. 249 |
| Using the DataRelation Class | p. 252 |
| Looking at Cursors | p. 261 |
| Examining Data Source Locking | p. 265 |
| Using ""Classic"" ADO and COM Interop | p. 276 |
| Summary | p. 279 |
| Presenting the IDE from a Database Viewpoint | p. 281 |
| Using the Server Explorer | p. 281 |
| Looking at Database Projects | p. 296 |
| Designing Databases with Visio for Enterprise Architect | p. 305 |
| Designing Databases with the Database Designer | p. 306 |
| Using the Table Designer | p. 314 |
| Designing Queries with the Query Designer | p. 321 |
| Script Editing Using the SQL Editor | p. 334 |
| Creating Typed Data Sets | p. 337 |
| Summary | p. 341 |
| Exception Handling | p. 343 |
| Enabling Exception Handling | p. 345 |
| Using Two or More Exception Handlers in One Procedure | p. 345 |
| Examining the Exception Class | p. 346 |
| Handling Exceptions in the Exception Handler | p. 348 |
| Filtering Exceptions | p. 354 |
| Creating Your Own Exception | p. 356 |
| Throwing an Exception | p. 356 |
| Handling Data-Related Exceptions | p. 357 |
| CLR Handling of Exceptions | p. 359 |
| Using the Debug Class | p. 359 |
| Summary | p. 366 |
| Using Stored Procedures, Views, and Triggers | p. 367 |
| Optimization Issues | p. 368 |
| Using Stored Procedures | p. 373 |
| Using Views | p. 397 |
| Using Triggers | p. 405 |
| Summary | p. 412 |
| Hierarchical Databases | p. 413 |
| Looking at LDAP | p. 413 |
| Accessing Active Directory Programmatically | p. 415 |
| Accessing Active Directory Using the OLE DB .NET Data Provider | p. 429 |
| Accessing Microsoft Exchange Server | p. 436 |
| Summary | p. 448 |
| Message Queues | p. 449 |
| Connectionless Programming | p. 450 |
| Taking a Quick Look at the MessageQueue Class | p. 450 |
| When to Use a Message Queue | p. 451 |
| How to Use a Message Queue | p. 453 |
| Making Message Queues Transactional | p. 480 |
| Looking at System-Generated Queues | p. 485 |
| Securing Your Message Queuing | p. 490 |
| Summary | p. 504 |
| Data Wrappers | p. 505 |
| Why Use Data Wrappers? | p. 505 |
| Looking at Object Oriented Programming | p. 506 |
| Wrapping a Database | p. 513 |
| Summary | p. 524 |
| Data-Bound Controls | p. 525 |
| Data-Bound Controls vs. Manual Data Hooking | p. 525 |
| Different Controls for Different Uls | p. 526 |
| Summary | p. 561 |
| Example Applications | p. 563 |
| UserMan | p. 565 |
| Identifying the UserMan Information | p. 565 |
| Discovering the Objects | p. 566 |
| Creating the Client | p. 582 |
| Tips and Ideas | p. 583 |
| Summary | p. 586 |
| Using XML with SQL Server 2000 | p. 587 |
| Using SQLXML 2.0 | p. 591 |
| Summary | p. 635 |
| Index | p. 637 |
| Table of Contents provided by Publisher. All Rights Reserved. |