
Applied ADO.NET
Building Data-Driven Solutions
By:Â David Talbot, Mahesh Chand
Paperback | 1 April 2003
At a Glance
924 Pages
23.5 x 17.8 x 3.81
Paperback
RRP $74.99
$74.75
or 4 interest-free payments of $18.69 with
 orÂShips in 5 to 7 business days
| About the Authors | p. xxi |
| About the Technical Reviewer | p. xxiii |
| Acknowledgments | p. xxv |
| Introduction | p. xxvii |
| ADO.NET Basics | p. 1 |
| Overview of Microsoft Data Access Technologies | p. 2 |
| ODBC | p. 2 |
| DAO | p. 4 |
| MFC ODBC and DAO Classes | p. 5 |
| RDO | p. 5 |
| OLE DB | p. 5 |
| ADO | p. 6 |
| ADO.NET | p. 6 |
| What Is ADO.NET? | p. 7 |
| Why ADO.NET Was Designed | p. 8 |
| Advantages of ADO.NET | p. 9 |
| Single Object-Oriented API | p. 9 |
| Managed Code | p. 10 |
| XML Support | p. 10 |
| Visual Data Components | p. 11 |
| Performance and Scalability | p. 11 |
| Comparing ADO.NET and ADO | p. 11 |
| Connections and Disconnected Data | p. 11 |
| Recordsets vs. DataSets | p. 12 |
| XML Support | p. 12 |
| Overview of ADO.NET Namespaces and Classes | p. 13 |
| Understanding ADO.NET Components | p. 15 |
| The Connection Object | p. 16 |
| The Command Object | p. 17 |
| The Command Builder | p. 19 |
| The DataAdapter Object | p. 19 |
| DataSet Structure | p. 20 |
| DataSets in DataViews | p. 21 |
| Writing ADO.NET Applications | p. 22 |
| Choosing a .NET Data Provider | p. 22 |
| Adding Namespace References | p. 23 |
| Establishing a Connection | p. 24 |
| Creating a Command or DataAdapter Object | p. 25 |
| Filling Data to a DataSet or DataReader Object | p. 25 |
| Displaying Data | p. 25 |
| Closing the Connection | p. 26 |
| Creating a Simple ADO.NET Application | p. 26 |
| Using a DataSet to Read Data | p. 28 |
| Summary | p. 31 |
| Data Components in Visual Studio .NET | p. 33 |
| Creating an ADO.NET Project | p. 33 |
| Using the Server Explorer | p. 34 |
| Adding a New Connection | p. 35 |
| Managing and Viewing Data | p. 36 |
| Using Visual Data Components | p. 37 |
| Understanding Data Connections | p. 38 |
| Understanding Connection Strings | p. 40 |
| Working with SQL DataAdapters | p. 40 |
| Using DataSet and DataView Components | p. 51 |
| Understanding Typed DataSets in VS .NET | p. 51 |
| Understanding the DataView | p. 54 |
| Using the Data Form Wizard | p. 57 |
| Data Form Wizard: Looking under the Hood | p. 66 |
| Understanding MyDS.xsd | p. 67 |
| Understanding DataFormLvb | p. 67 |
| Summary | p. 71 |
| ADO.NET in Disconnected Environments | p. 73 |
| Understanding the ADO.NET Architecture | p. 75 |
| Exploring the ADO.NET Class Hierarchy | p. 76 |
| Choosing a Data Provider | p. 80 |
| Understanding ADO.NET Disconnected Classes | p. 81 |
| The System.Data Namespace | p. 81 |
| The System.Data.Common Namespace | p. 82 |
| Working with DataTables | p. 83 |
| The DataColumn | p. 85 |
| The DataRow | p. 94 |
| The DataRelation | p. 99 |
| The DataTable | p. 100 |
| More DataTable Operations | p. 106 |
| The Row and Column Collections | p. 115 |
| The DataRow States and Versions | p. 117 |
| Using DataSet, DataView, and DataViewManager | p. 120 |
| The DataSet: The Heart of ADO.NET | p. 121 |
| Typed and Untyped DataSets | p. 127 |
| The DataView | p. 128 |
| The DataViewManager | p. 132 |
| Summary | p. 133 |
| ADO.NET in Connected Environments | p. 135 |
| Understanding the Generic Data Provider Model | p. 135 |
| Importing a Namespace | p. 137 |
| Exploring the System.SqlClient Namespace | p. 137 |
| The Connection: Connecting to a Data Source | p. 139 |
| Creating a Connection | p. 139 |
| Understanding the Connection Properties and Methods | p. 140 |
| Opening and Closing a Connection | p. 142 |
| Understanding Connection Pooling | p. 145 |
| Using the CreateCommand and ChangeDatabase Methods | p. 149 |
| The Command: Executing SQL Statements | p. 150 |
| Creating a Command Object | p. 151 |
| Creating and Using OleDbCommand | p. 153 |
| Using the CommandType Enumeration | p. 154 |
| Calling a Stored Procedure | p. 155 |
| Using TableDirect | p. 157 |
| Executing a Command | p. 158 |
| Using Other Command Methods | p. 160 |
| The DataReader: Walking through the Data | p. 160 |
| Initializing a DataReader | p. 161 |
| Understanding DataReader Properties and Methods | p. 161 |
| Reading with the DataReader | p. 162 |
| Interpreting Batches of Queries | p. 164 |
| Understanding Command Behaviors | p. 165 |
| The DataAdapter: Adapting to Your Environment | p. 166 |
| Constructing a DataAdapter Object | p. 166 |
| Understanding DataAdapter Properties | p. 168 |
| Understanding DataAdapter Methods | p. 170 |
| Filling the DataSet | p. 170 |
| Adding a DataTable to a DataSet | p. 172 |
| Looking at a DataAdapter Example | p. 172 |
| Filling the DataAdapter from a Recordset | p. 175 |
| Updating the Database Using the Update Method | p. 176 |
| Table and Column Mapping | p. 178 |
| CommandBuilder: Easing the Work of Programmers | p. 181 |
| Creating a CommandBuilder Object | p. 182 |
| Using SqlCommandBuilder Members | p. 182 |
| Using SqlCommandBuilder | p. 182 |
| Staying within the Parameters | p. 184 |
| The DataSet in Connected Environments | p. 188 |
| Filling a DataSet from Multiple Tables | p. 188 |
| Using a SQL Statement to Read Data from Two or More Tables | p. 190 |
| Adding, Updating, and Deleting Data through the DataSet | p. 190 |
| Accepting and Rejecting Changes through the DataSet | p. 191 |
| Saving Changed Data Only | p. 192 |
| Using a DataSet vs. Using a DataReader | p. 193 |
| Fetching Data Based on Wildcard Characters | p. 194 |
| The DataView in Connected Environments | p. 194 |
| Creating Multiple Views | p. 195 |
| Using Transactions in ADO.NET | p. 200 |
| Using Concurrency in ADO.NET | p. 201 |
| Understanding Rollback, Commit, and Savepoints | p. 204 |
| Executing Batches | p. 206 |
| Summary | p. 208 |
| Handling ADO.NET Events | p. 209 |
| Working with Connection Events | p. 211 |
| Working with DataAdapter Events | p. 215 |
| Working with DataSet Events | p. 220 |
| Working with DataTable Events | p. 221 |
| Working with XmlDataDocument Events | p. 226 |
| Working with DataView and DataViewManager Events | p. 229 |
| Summary | p. 231 |
| Integrating XML with ADO.NET | p. 233 |
| Understanding Microsoft .NET and XML | p. 233 |
| Using the System.Xml Namespace | p. 234 |
| Using the System.Xml.Schema Namespace | p. 235 |
| Using the System.Xml.Serialization Namespace | p. 236 |
| Using the System.Xml.XPath Namespace | p. 236 |
| Using the System.Xml.Xsl Namespace | p. 236 |
| Using the Document Object Model Interfaces | p. 237 |
| Looking at the XML .NET Architecture | p. 237 |
| Adding a System.Xml Namespace Reference | p. 238 |
| Reading XML | p. 238 |
| Getting Node Information | p. 239 |
| Moving to a Content Node | p. 242 |
| Using the GetAttributes of a Node | p. 243 |
| Searching for a Node | p. 244 |
| Closing the Document | p. 245 |
| Understanding the XmlWriter Classes | p. 246 |
| Setting XmlWriter Properties | p. 247 |
| Writing XML Items | p. 247 |
| Seeing XmlWriter in Action | p. 248 |
| Using the Close Method | p. 250 |
| Using the XmlConvert Class | p. 251 |
| Understanding the DOM Implementation | p. 251 |
| Using the XmlNode Class | p. 252 |
| Using the XmlDocument Class | p. 252 |
| Saving a Document | p. 253 |
| Using the XmlDocumentFragment Class | p. 253 |
| Using the XmlElement Class | p. 254 |
| Adding Attributes to a Node | p. 259 |
| Understanding Transformation and XSLT | p. 260 |
| Using the Transform Method | p. 261 |
| Looking at an Example | p. 261 |
| Using ADO.NET and XML Together | p. 262 |
| Reading XML Using a DataSet | p. 262 |
| Writing XML Using a DataSet | p. 264 |
| Using XmlDataDocument and XML | p. 267 |
| Displaying XML Data in a DataSet Format | p. 270 |
| Saving Data from a DataSet to XML | p. 271 |
| XmlDataDocument: Looking under the Hood | p. 272 |
| Navigating in XML | p. 272 |
| Using the XPathNavigator Class | p. 273 |
| Using XPathNavigator Move Methods | p. 274 |
| Searching Using XPathNavigator | p. 276 |
| Working with Schemas | p. 277 |
| Generating a New Schema | p. 277 |
| Adding Schema from a Database Objects | p. 283 |
| Generating a Typed DataSet from a Schema | p. 285 |
| Summary | p. 286 |
| Data Binding and Windows Forms Data-Bound Controls | p. 287 |
| Understanding Data Binding | p. 287 |
| Using the Binding Class | p. 288 |
| Understanding the BindingManagerBase Functionality | p. 293 |
| Understanding BindingContext | p. 296 |
| Building a Record Navigation System | p. 296 |
| Working with Complex Data-Bound Controls | p. 301 |
| The Role of Control Class in Data Binding | p. 301 |
| Using the ListControl Class | p. 301 |
| ListControl DataBinding-Related Events | p. 302 |
| Data Binding in ComboBox and ListBox Controls | p. 304 |
| Data Binding in a DataGrid Control | p. 306 |
| Deleting Data Binding | p. 307 |
| The DataGrid: Super Data-Bound Control | p. 307 |
| Understanding the DataGrid Class Members | p. 309 |
| Exploring the DataGrid Helper Objects | p. 312 |
| Understanding the DataGrid and DataGrid Column Styles | p. 313 |
| Seeing DataGridTableStyle and DataGridColumnStyle in Action | p. 321 |
| Seeing HitTest in Action | p. 324 |
| Implementing Custom Sorting in a DataGrid | p. 334 |
| Building a DataGrid Record Navigation System | p. 335 |
| Implementing Search in a DataGrid | p. 338 |
| Inserting, Updating, and Deleting Data through DataGrids | p. 342 |
| Summary | p. 344 |
| Constraints and Data Relations | p. 345 |
| Understanding Constraints | p. 345 |
| Implementing the Constraint Classes | p. 346 |
| Implementing the ForeignKeyConstraint Class | p. 346 |
| Understanding Data Relations | p. 353 |
| Understanding the DataRelation and | |
| DataRelationCollection Objects | p. 354 |
| Summary | p. 358 |
| ADO.NET Exception Handling | p. 359 |
| Why Use Exception Handling? | p. 360 |
| Using Try Catch Statements | p. 361 |
| Using Try Catch Finally Statements | p. 362 |
| Nesting Try...Catch Statements | p. 363 |
| Using Try with Multiple Catch Statements | p. 363 |
| Defining Custom Filters and Error Messages | p. 364 |
| Understanding the Exception Classes | p. 365 |
| Using the Exception Class: Mother of All Exceptions | p. 365 |
| Understanding Other Exception Classes | p. 366 |
| Exception Handling in ADO.NET | p. 366 |
| Recognizing SQL Server 2000 Errors | p. 368 |
| Using SQL Server Error Logs | p. 370 |
| Using the SqlException Class | p. 371 |
| Using the SqlError and SqlErrorCollection Classes | p. 373 |
| Summary | p. 374 |
| Working with the ODBC .NET Data Provider | p. 375 |
| Using the ODBC .NET Data Provider | p. 375 |
| Installing the ODBC .NET Data Provider | p. 376 |
| Understanding the ODBC .NET Data Provider | p. 377 |
| Accessing Access Databases | p. 378 |
| Accessing MySQL Databases | p. 380 |
| Accessing MySQL Databases | p. 381 |
| Accessing Text File Databases | p. 382 |
| Exporting an Access Table to a Text File | p. 383 |
| Accessing a Text File | p. 385 |
| Accessing Excel Databases | p. 389 |
| Implementing Two .NET 1.1 Updates | p. 391 |
| Summary | p. 391 |
| Stored Procedures and Views | p. 393 |
| Working with Stored Procedures | p. 393 |
| Creating a Stored Procedure | p. 393 |
| Executing a Stored Procedure from VS .NET | p. 397 |
| Executing a Stored Procedure Programmatically | p. 399 |
| Understanding SQL Injection | p. 405 |
| Working with Views | p. 406 |
| Creating a View | p. 406 |
| Executing a View from VS .NET | p. 409 |
| Retrieving Data from a View Programmatically | p. 409 |
| Filling a DataSet from Multiple Views | p. 411 |
| Summary | p. 411 |
| Oracle, SQLXML, and Other .NET Data Providers | p. 413 |
| Using Oracle .NET Data Providers | p. 413 |
| Adding a Reference to the Oracle .NET Data Provider | p. 415 |
| Using the Oracle .NET Data Provider Classes | p. 416 |
| Using the SQLXML and SQL XML .NET Data Providers | p. 426 |
| Using the FOR XML Keyword | p. 427 |
| Using the SqlXmlAdapter Object | p. 428 |
| Using the SqlXmlParameter Object | p. 429 |
| Using the SqlXmlCommand Object | p. 430 |
| Using a MySQL Database and the .NET Data Provider | p. 435 |
| Summary | p. 435 |
| Developing a Custom Data Provider | p. 437 |
| Overview of the Data Provider Interfaces | p. 438 |
| Understanding the Connection Object | p. 439 |
| Understanding the Command Object | p. 440 |
| Understanding the Reader Object | p. 441 |
| Understanding the Adapter Object | p. 443 |
| Building a Custom Data Provider | p. 446 |
| Creating the PipedDataConnection Object | p. 446 |
| Creating the PipedDataCommand Object | p. 449 |
| Creating the PipedDataReader Object | p. 453 |
| Creating the PipedDataAdapter Object | p. 460 |
| Testing the PipedDataProvider Application | p. 462 |
| Debugging Your Custom Data Provider | p. 464 |
| Summary | p. 464 |
| Developing Database Web Applications Using ASP.NET | p. 465 |
| Introducing ASP.NET | p. 465 |
| ASPNET Platform Requirements | p. 466 |
| ASPNET Language Support | p. 466 |
| Installing ASPNET | p. 466 |
| ASPNET Editors | p. 466 |
| ASPNET: An Evolution of ASP | p. 467 |
| Web Forms and Web Services | p. 468 |
| Developing Your First ASP.NET Web Application | p. 468 |
| Creating a Web Application Project | p. 469 |
| Adding Web Controls to a Web Form | p. 472 |
| Setting Control Properties | p. 474 |
| Using Document Outline | p. 475 |
| Writing Code on the Button Click Event Handler | p. 477 |
| Creating Your First ADO.NET Web Application | p. 478 |
| Using ASP.NET Server-Side Controls | p. 480 |
| HTML Server Controls | p. 481 |
| Validation Controls | p. 482 |
| User Controls | p. 483 |
| Server Controls and the .NET Framework Library | p. 483 |
| Why Are Web Forms Controls Called Server-Side Controls? | p. 485 |
| Adding Server-Side Controls to a Web Form | p. 485 |
| Understanding Data Binding in ASP.NET | p. 487 |
| Data-Bound Controls | p. 488 |
| DataGrid and DataList Controls | p. 490 |
| Paging in the DataGrid Control | p. 499 |
| Enabling Paging Programmatically | p. 500 |
| Adding, Editing, and Deleting Data in Web Forms | p. 502 |
| Adding Data | p. 505 |
| Updating Data | p. 506 |
| Deleting Data | p. 507 |
| Creating a Guest Book in ASP.NET | p. 507 |
| Default Web Form: MyGuestBook.aspx | p. 508 |
| Adding Forms to the Guest Book | p. 511 |
| Compiling and Running the Guest Book Project | p. 514 |
| Summary | p. 516 |
| Using ADO.NET in XML Web Services | p. 517 |
| Exploring Web Services and the .NET Framework Library | p. 518 |
| Creating a Web Service in VS .NET | p. 518 |
| Testing Your Web Service | p. 521 |
| Creating the Web Service Consumer | p. 524 |
| Adding Data to a Database Through a Web Service | p. 529 |
| Adding More Functionality to the Web Service | p. 534 |
| Summary | p. 535 |
| ASP.NET Server Controls and Data Binding | p. 537 |
| Data Binding in Web Forms, Revisited | p. 537 |
| Read-Only Data Binding | p. 537 |
| Simple and Complex Data Binding | p. 538 |
| The Roles of the Control and Page Classes in Data Binding | p. 539 |
| Data Binding in Simple Web Forms Controls | p. 540 |
| Using the Button Control | p. 540 |
| Using the Calendar Control | p. 542 |
| Understanding Web Server Control Templates | p. 546 |
| Using the Repeater Control | p. 552 |
| Understanding the Role of the ListControl Class | p. 555 |
| Using the ListBox Control | p. 556 |
| Using the DropDownList Control | p. 558 |
| Data Binding in Other Simple Controls | p. 560 |
| Data Binding in Complex Web Forms Controls | p. 562 |
| Understanding the BaseDataList Class | p. 562 |
| Using the DataKeyCollection Class | p. 563 |
| Using the DataList Web Server Control | p. 564 |
| Using the DataGrid Web Server Control | p. 582 |
| Summary | p. 608 |
| Building Real-World Web Applications | p. 609 |
| Introducing the Job Board Application Specifications | p. 609 |
| Understanding the Database Schema | p. 610 |
| Developing the Online Job Board Application | p. 611 |
| Creating the Login.aspx Page | p. 612 |
| Creating the Register.aspx Page | p. 615 |
| Creating the Contact.aspx Page | p. 617 |
| Creating the PostJob.aspx Page | p. 618 |
| Creating the PostResume.aspx Page | p. 620 |
| Creating the DisplayData.aspx and Resumes.aspx Pages | p. 623 |
| Creating the dnjHeader.aspx Page | p. 632 |
| Running the Application | p. 633 |
| Improving and Modifying the Application | p. 635 |
| Summary | p. 636 |
| Object-Relational Mapping in .NET | p. 637 |
| Why Not Just Use a DataSet? | p. 638 |
| Understanding Object Databases | p. 639 |
| Why Object Relational Mapping? | p. 640 |
| Creating the Basic Design of the Video Store Application | p. 640 |
| Understanding the Basic Architecture | p. 641 |
| Creating the Database Design of the Video Store | p. 641 |
| Creating the Data Object | p. 643 |
| Creating the Mapped Object | p. 644 |
| Creating the Data Access Component | p. 648 |
| Building the VideoTape Test Case | p. 652 |
| Using the User Component | p. 654 |
| Creating the User Test Case | p. 659 |
| Managing Dependencies | p. 661 |
| Creating the Check In/Check Out Component | p. 663 |
| Seeing How It Works | p. 664 |
| Making Design Tradeoffs | p. 665 |
| Understanding Logic in Stored Procedures | p. 665 |
| Understanding Component Isolation | p. 666 |
| Creating a Workaround on Part of the Problem | p. 667 |
| Creating the VideoCheckInCheckOut Test Case | p. 670 |
| Summary | p. 673 |
| Mapped Objects: Performance Considerations and Data Binding | p. 675 |
| Using Data Binding and Mapped Objects | p. 675 |
| Directly Accessing a Bound Object's Properties | p. 678 |
| Using Logic with Bound Objects | p. 680 |
| Understanding Problematic Master-Detail Relationships | p. 684 |
| Working with Highly Nested Structures | p. 685 |
| Working with a Much Larger Tree | p. 691 |
| A Final Note on Tree Optimization | p. 693 |
| Working with Large Master-Detail Relationships | p. 694 |
| Implementing Lazy Loading | p. 695 |
| Implementing an Incremental Lazy Loading Scheme | p. 700 |
| Loading the Detail When the Master Is Loaded | p. 705 |
| Using a Near-Zero-Impact Caching Mechanism | p. 706 |
| Summary | p. 708 |
| COM Interoperability and ADO.NET | p. 709 |
| Exploring the .NET Interop Tools | p. 710 |
| Using Visual Studio .NET | p. 710 |
| Using the Type Library Importer and Exporter (Tlbimp.exe) | p. 711 |
| Using the Type Library Exporter (Tlbexp.exe) | p. 712 |
| Using the ADO Recordset in ADO.NET | p. 712 |
| Using ADOX with ADO.NET | p. 716 |
| Accessing OLAP Server Data with ADO.NET | p. 718 |
| Summary | p. 724 |
| Messaging | p. 725 |
| Introducing Types of Queues | p. 725 |
| Using User Queues | p. 726 |
| Using System Queues | p. 726 |
| Installing Message Queuing | p. 726 |
| Using the System.Messaging Namespace | p. 727 |
| Working with Message Queues | p. 729 |
| Using the MessageQueue Properties | p. 729 |
| Managing Queues Using VS .NET | p. 731 |
| Retrieving Available Queues | p. 732 |
| Filtering Queues Using MessageQueueCriteria | p. 734 |
| Creating and Deleting Message Queues Programmatically | p. 735 |
| Creating a Sample Application | p. 736 |
| Creating a MessageQueue Instance | p. 738 |
| Setting a Queue's Path | p. 739 |
| Sending and Receiving Messages | p. 740 |
| Walking Through Simple Messaging Application | p. 741 |
| Working with Messages | p. 745 |
| Creating and Removing Messages | p. 745 |
| Setting Queue and Message Priorities | p. 746 |
| Understanding Transactional Messaging | p. 747 |
| Using the MessageQueueTransaction Class | p. 747 |
| Creating Transactional Queues | p. 748 |
| Sending and Receiving Transactional Messages | p. 748 |
| Encrypting Messages | p. 750 |
| Summary | p. 752 |
| SQL Server and ADO.NET: Notes on Performance | p. 753 |
| Improving SQL Server Performance | p. 753 |
| Using Indexes | p. 753 |
| Choosing Which Columns to Index | p. 757 |
| Understanding the SQL Server Profiler | p. 758 |
| Optimizing Automatically with the SQL Server Profiler | p. 760 |
| Optimizing Your Transact-SQL Queries for Performance | p. 762 |
| Avoiding Excessive Stored Procedure Recompilation | p. 765 |
| Avoiding Locks | p. 766 |
| Designing Your Tables for Optimal Performance | p. 766 |
| Checking the Size of Database Pages | p. 767 |
| Understanding Denormalization | p. 768 |
| Understanding the Dangers of Database Design Slippage | p. 768 |
| Understanding ADO.NET Performance Issues and Using Best Practices | p. 769 |
| Selecting Data Providers | p. 769 |
| Writing a Generic Data Access Component | p. 770 |
| Choosing a Development Mode: Designer vs. Manual | p. 775 |
| Retrieving Data: DataReader, XmlReader, and DataSet | p. 775 |
| Updating a Data Source: Command vs. DataSet | p. 776 |
| Saving Data and Using GetChanges | p. 777 |
| Retrieving Data with the SELECT Statement | p. 777 |
| Using Stored Procedures | p. 777 |
| Using Connection Strings and Pooling | p. 777 |
| Summary | p. 778 |
| Relational Databases: Some Basic Concepts | p. 779 |
| Understanding Normalization | p. 780 |
| First Normal Form (1NF) | p. 780 |
| Second Normal Form (2NF) | p. 782 |
| Third Normal Form (3NF) | p. 784 |
| Boyce-Codd Normal Form (BCNF) | p. 785 |
| Fourth Normal Form (4NF) | p. 785 |
| Fifth Normal Form (5NF or PJ/NF) | p. 786 |
| Introducing Sets, Cursors, and ADO.NET | p. 786 |
| Using Locking | p. 788 |
| Isolation Levels | p. 788 |
| Locking Modes | p. 790 |
| Summary | p. 792 |
| Commonly Used SQL Statements | p. 793 |
| Understanding SQL References | p. 793 |
| Using the SELECT Statement | p. 796 |
| Using the UPDATE Statement | p. 802 |
| Using the DELETE Statement | p. 802 |
| Using the CREATE TABLE Statement | p. 803 |
| Using the DROP TABLE Statement | p. 803 |
| Using the TRUNCATE TABLE Statement | p. 804 |
| Using the INSERT Statement | p. 805 |
| Using Joins and Aliases | p. 806 |
| Understanding Views | p. 807 |
| Using SQL Server's SELECT FOR XML Clause | p. 809 |
| Summary | p. 810 |
| ADO.NET Frequently Asked Questions | p. 811 |
| Summary | p. 845 |
| Index | p. 847 |
| Table of Contents provided by Publisher. All Rights Reserved. |
ISBN: 9781590590737
ISBN-10: 1590590732
Series: Net Developer
Published: 1st April 2003
Format: Paperback
Language: English
Number of Pages: 924
Audience: General Adult
Publisher: Springer Nature B.V.
Country of Publication: GB
Dimensions (cm): 23.5 x 17.8 x 3.81
Weight (kg): 1.45
Shipping
| Standard Shipping | Express Shipping | |
|---|---|---|
| Metro postcodes: | $9.99 | $14.95 |
| Regional postcodes: | $9.99 | $14.95 |
| Rural postcodes: | $9.99 | $14.95 |
Orders over $79.00 qualify for free shipping.
How to return your order
At Booktopia, we offer hassle-free returns in accordance with our returns policy. If you wish to return an item, please get in touch with Booktopia Customer Care.
Additional postage charges may be applicable.
Defective items
If there is a problem with any of the items received for your order then the Booktopia Customer Care team is ready to assist you.
For more info please visit our Help Centre.
You Can Find This Book In
This product is categorised by
- Non-FictionComputing & I.T.Computer Programming & Software DevelopmentObject-Oriented Programming or OOP
- Non-FictionComputing & I.T.Computer Programming & Software DevelopmentWeb Programming
- Non-FictionComputing & I.T.Computer Programming & Software DevelopmentProgramming & Scripting Languages
- Non-FictionComputing & I.T.Databases
- Non-FictionComputing & I.T.Computer Programming & Software DevelopmentMicrosoft Programming
- Non-FictionComputing & I.T.Computer Programming & Software DevelopmentSoftware Engineering
























