| Foreword | p. iv |
| About the Author | p. xiii |
| Acknowledgments | p. xv |
| Introduction | p. xvii |
| ADO Classic | p. 1 |
| Working with ADO | p. 3 |
| Choosing the "Right" Version of ADO | p. 3 |
| What's New in ADO 2.5? | p. 6 |
| What's New in ADO 2.6? | p. 8 |
| What's New in ADO 2.7? | p. 9 |
| The ADO Component Checker | p. 9 |
| Installing ADO | p. 10 |
| Deploying ADO | p. 11 |
| The .NET Framework Approach | p. 13 |
| Getting More Help with ADO | p. 14 |
| Introduction to ADO | p. 15 |
| ADO and OLE DB | p. 15 |
| The ADO Object Model | p. 18 |
| Creating ADO Objects | p. 23 |
| Instantiating ADO Objects | p. 23 |
| Instantiating ADO Components in Visual Basic Script | p. 25 |
| When Things Go Wrong | p. 27 |
| Getting Connected | p. 29 |
| The ADO Connection Object | p. 31 |
| Using the Connection Object | p. 34 |
| Managing Transactions | p. 74 |
| ADO Command Strategies | p. 81 |
| Inner Workings of the Command Object | p. 82 |
| Building Command Objects | p. 86 |
| Managing Command Objects | p. 124 |
| Performance Considerations: Using Command Objects Wisely | p. 137 |
| Recordset Strategies | p. 139 |
| Introducing Recordsets | p. 139 |
| Constructing Recordset Objects | p. 144 |
| Working with Recordset Objects | p. 148 |
| Manipulating Your Recordset | p. 225 |
| Data Binding Your Recordset | p. 225 |
| Understanding the State Property | p. 226 |
| Fetching Techniques | p. 227 |
| Sorting, Filtering, and Finding | p. 243 |
| Disconnecting Recordsets | p. 248 |
| Choosing Read-Only vs. Read-Write Recordsets | p. 249 |
| Working with Field Objects | p. 249 |
| Working with Stored Procedures | p. 261 |
| Accessing Deprecated Recordsets | p. 287 |
| Recordset Events | p. 289 |
| Understanding Record and Stream Objects | p. 293 |
| Introducing the ADO Record Object | p. 293 |
| Introducing the Stream Object | p. 294 |
| Passing Resultsets Between Layers | p. 301 |
| Delivering Pizza with a Dump Truck | p. 302 |
| Understanding Recordset Marshaling | p. 306 |
| Passing Disconnected Recordsets | p. 312 |
| Passing Strings and String Arrays | p. 318 |
| Passing OUTPUT Parameters Instead of Rowsets | p. 321 |
| Passing Variant Arrays | p. 324 |
| Passing User-defined Structures | p. 326 |
| Passing PropertyBags | p. 338 |
| Passing XML | p. 341 |
| Getting Your Data into Shape | p. 345 |
| The Shape Provider | p. 346 |
| Building a Simple Shape | p. 347 |
| Why Not Use the Data Environment Designer? | p. 353 |
| Analyzing the Impact | p. 356 |
| Finding a Better Way | p. 357 |
| The Impact of the "Just Enough" Approach | p. 359 |
| Data Access Tips and Techniques | p. 361 |
| Referencing Data on Other Servers | p. 361 |
| TSOL Tips | p. 362 |
| Performance-Tuning Stored Procedures | p. 365 |
| SET NOCOUNT Using OLE DB Providers | p. 366 |
| Granting Permissions | p. 367 |
| More Recordset Secrets | p. 369 |
| Working with the Grid Control | p. 374 |
| Working with Strings | p. 375 |
| Working with Graphics | p. 377 |
| MDAC/ADO Setup Issues | p. 377 |
| Hooking up Visual Basic/ADO Help | p. 378 |
| ADO and the Visual Database Tools | p. 379 |
| Using the Data View Window | p. 380 |
| Using the Data Environment Designer | p. 386 |
| Using ADO without the Data Environment Designer | p. 394 |
| Using the Data Object Wizard | p. 395 |
| ADO.NET and the .NET Framework | p. 399 |
| Introducing ADO.NET | p. 401 |
| How We Got Here | p. 401 |
| ADO.NET--A New Beginning | p. 405 |
| Understanding ADO.NET Infrastructure | p. 407 |
| ADO.NET .NET Data Providers | p. 413 |
| ADO.NET and Disconnected Data Structures | p. 418 |
| The System.Data Namespace | p. 419 |
| ADO.NET's Low-Level Data Stream | p. 432 |
| ADO.NET--Getting Connected | p. 435 |
| ADO.NET .NET Data Providers | p. 436 |
| Creating ADO.NET Connection Objects | p. 438 |
| Connecting via the SqlClient .NET Data Provider | p. 446 |
| Managing Transactions | p. 453 |
| Connecting with the Odbc .NET Data Provider | p. 454 |
| Opening ADO.NET Connections in Code | p. 457 |
| Using the IDE to Get Connected | p. 458 |
| Closing Connections | p. 460 |
| COM-based ADO as a .NET Data Provider | p. 468 |
| ADO.NET Command Strategies | p. 473 |
| Understanding ADO.NET Commands | p. 473 |
| Binding to Resultset Columns | p. 524 |
| ADO.NET DataReader Strategies | p. 529 |
| Comparing ADOc with ADO.NET | p. 530 |
| Understanding the DataReader | p. 532 |
| Using the DataReader Get Methods to Retrieve Data | p. 539 |
| Cleaning Up After your DataReader | p. 543 |
| Using the DataTable and DataSet | p. 545 |
| Understanding the DataSet and DataTable Structure | p. 547 |
| Importing ADOc Recordsets | p. 555 |
| Building DataTables | p. 559 |
| Accessing DataTable Data | p. 567 |
| Accessing DataSet Data | p. 581 |
| Binding to DataSets | p. 582 |
| Filtering, Sorting, and Finding | p. 585 |
| Filtering and Sorting with the Select Method | p. 586 |
| Working with the DataViewManager | p. 598 |
| Using the Find Methods | p. 600 |
| ADO.NET Update Strategies | p. 607 |
| Changing Data--The Fundamentals | p. 608 |
| Update Strategies | p. 622 |
| Using Visual Studio to Generate Action Queries | p. 633 |
| Retrieving Autonumber, Identity, or GUIDs | p. 641 |
| Understanding the Update Methods | p. 645 |
| Update Performance | p. 647 |
| Updating the Authors Table--An Example | p. 649 |
| Update Error Handling Strategies | p. 656 |
| Handling Update Method Exceptions | p. 660 |
| Executing Ad Hoc Queries to Perform Updates | p. 664 |
| Merging and Transporting Data | p. 664 |
| ADO.NET Constraint Strategies | p. 667 |
| Understanding .NET Constraints | p. 667 |
| How ADO.NET Implements Constraints | p. 669 |
| Creating DataRelation Objects | p. 679 |
| ADO.NET Error Management Strategies | p. 685 |
| Structured Exception Handling | p. 686 |
| Understanding Try/Catch | p. 686 |
| Trapping Specific vs. General Exceptions | p. 690 |
| The System.Data Exceptions | p. 690 |
| Displaying the Error Message | p. 695 |
| ADO.NET and XML | p. 697 |
| XML Support in ADO.NET | p. 698 |
| Standardizing on XML Formats | p. 699 |
| Understanding XML and DataSet Objects | p. 700 |
| Creating a Web Service as an XML Data Source | p. 710 |
| Passing an Updated DataSet Back to a Web Service | p. 720 |
| Creating Custom Error Handlers | p. 725 |
| ADO.NET and SOAP | p. 726 |
| Working with the Biblio Sample Database | p. 729 |
| CompareCursorLocation Chart | p. 731 |
| ADOc Dynamic Properties | p. 743 |
| Index | p. 753 |
| Table of Contents provided by Syndetics. All Rights Reserved. |