Introduction

This is Part 2 of ADO.NET. In this section, we will touch base on one of the important concepts in ADO.NET.
In case if you have not seen Part 1 of ADO.NET, click here
Happy job hunting......
(B) How do we use stored procedures in ADO.NET and how do we provide parameters to the stored procedures?
ADO.NET provides the SqlCommand object, which provides the functionality of executing stored procedures.
Note :- Sample code is provided in folder "WindowsSqlClientCommand". There are two stored procedures created in the same database "Employees" which were created for the previous question.
  1. CREATE PROCEDURE SelectByEmployee @FirstName nvarchar(200) AS
  2. Select FirstName from Employees where FirstName like @FirstName + '%'
  3. CREATE PROCEDURE SelectEmployee AS
  4. Select FirstName from Employees
  5. If txtEmployeeName.Text.Length = 0 Then
  6. objCommand = New SqlCommand("SelectEmployee")
  7. Else
  8. objCommand = New SqlCommand("SelectByEmployee")
  9. objCommand.Parameters.Add("@FirstName", Data.SqlDbType.NVarChar, 200)
  10. objCommand.Parameters.Item("@FirstName").Value = txtEmployeeName.Text.Trim()
  11. End If
In the above sample, not much has been changed only that the SQL is moved to the stored procedures. There are two stored procedures one is "Select Employee" which selects all the employees and the other is "SelectByEmployee" which returns employee name starting with a specific character. As you can see to provide parameters to the stored procedures, we are using the parameter object of the command object. In such a question interviewer expects two simple answers one is that we use a command object to execute stored procedures and the parameter object to provide a parameter to the stored procedure. The above sample is provided only for getting the actual feel of it. Be short be nice and get a job.
(B) How can we force the connection object to close after my data reader is closed?
Command method Execute reader takes a parameter called as Command Behavior wherein we can specify saying close connection automatically after the Data reader is close.
  1. objDataReader = pobjCommand.ExecuteReader (CommandBehavior.CloseConnection)
(B) I want to force the data reader to return only schema of the datastore rather than data.
  1. objDataReader = pobjCommand.ExecuteReader (CommandBehavior.SchemaOnly)
(B) How can we fine-tune the command object when we are expecting a single row?
Again, CommandBehaviour enumeration provides two values Single Result and Single Row. If you are expecting a single value then pass "CommandBehaviour.SingleResult" and the query is optimized accordingly if you are expecting a single row then pass "CommandBehaviour.SingleRow" and the query is optimized according to a single row.
(B) Which is the best place to store the connection string in .NET projects?
Config files are the best places to store connection strings. If it is a web-based application "Web.config" file will be used and if it is a windows application "App.config" files will be used.
(B) What are the steps involved to fill a dataset?
  1. Twist: - How can we use a data adapter to fill a dataset?
  2. Sample code is provided in "WindowsDataSetSample" folder in CD."LoadData" has all the implementation of connecting and loading to the dataset. This dataset is finally bound to a List Box. Below is the sample code.
  1. Private Sub LoadData()
  2. Dim strConnectionString As String
  3. strConnectionString = AppSettings.Item("ConnectionString")
  4. Dim objConn As New SqlConnection(strConnectionString)
  5. objConn.Open()
  6. Dim objCommand As New SqlCommand("Select FirstName from Employees")
  7. objCommand.Connection = objConn
  8. Dim objDataAdapter As New SqlDataAdapter()
  9. objDataAdapter.SelectCommand = objCommand
  10. Dim objDataSet As New DataSet
  11. End Sub
In such type of questions, the interviewer is looking from a practical angle, that have you worked with dataset and data adapters. Let me try to explain the above code first and then we move to what steps should be told during the interview.
  1. Dim objConn As New SqlConnection(strConnectionString)
  2. objConn.Open()
First step is to open the connection. Again, note the connection string is loaded from config file.
  1. Dim objCommand As New SqlCommand("Select FirstName from Employees")
  2. objCommand.Connection = objConn
The second step is to create a command object with the appropriate SQL and set the connection object to this command.
  1. Dim objDataAdapter As New SqlDataAdapter()
  2. objDataAdapter.SelectCommand = objCommand
The third step is to create the Adapter object and pass the command object to the adapter object.
  1. objDataAdapter.Fill(objDataSet)
The fourth step is to load the dataset using the "Fill" method of the data adapter.
  1. lstData.DataSource = objDataSet.Tables(0).DefaultView
  2. lstData.DisplayMember = "FirstName"
  3. lstData.ValueMember = "FirstName"
The fifth step is to bind to the loaded dataset with the GUI. At this moment sample has a list box as the UI. Binding of the UI is done by using the Default View of the dataset. Just to revise every dataset has tables and every table has views. In this sample, we have only loaded one table i.e. Employee table so we are referring to that with an index of zero.
Just say all the five steps during the interview and you will see the smile on the interviewer's face and appointment letter in your hand.
(B) What are the various methods provided by the dataset object to generate XML?
Note:- XML is one of the most important leaps between classic ADO and ADO.NET. So this question is normally asked more generally how can we convert any data to XML format. The best answer is to convert into a dataset and use the below methods.
(B) How can we save all data from the dataset?
Dataset has the "Accept Changes" method, which commits all the changes since the last time "Accept changes" has been executed.
Note:- This book does not have any sample of Accept changes. We leave that to readers as a homework sample. But yes from the interview aspect that will be enough.
(B) How can we check that some changes have been made to the dataset since it was loaded?
Twist: - How can we cancel all changes done in the dataset?
Twist: - How do we get values, which are changed, in a dataset?
For tracking down changes, Dataset has two methods, which come as rescue "Get Changes "and "Has Changes".
Note:- One of the most misunderstood things about these properties is that it tracks the changes of the actual database. That is a fundamental mistake; actually the changes are related to only changes with the dataset and have nothing to with changes happening in the actual database. As the dataset is disconnected and does not know anything about the changes happening in the actual database.
(B) How can we add/remove row is in the "Data Table" object of "Dataset"?
"Data table" provides "NewRow" method to add a new row to "Data Table". "Data Table" has a "DataRowCollection" object that has all rows in a "Data Table" object. Following are the methods provided by the "DataRowCollection" object:-
(B) What is the basic use of "Data View"?
"Data View" represents a complete table or can be a small section of rows depending on some criteria. It is best used for sorting and finding data within the "data table".
Data view has the following methods:-
If we want to manipulate data of the "Data Table" object create "Data View" (Using the "Default View" we can create "Data View" object) of the "Data Table" object and use the following functionalities:-
(B) What is the difference between "Dataset" and "Data Reader"?
Twist: - Why is Dataset slower than Data Reader is? The fourth point is the answer to the twist.
Note:- This is my best question and we expect everyone to answer it. It is asked almost 99% in all companies...Basic very Basic cram it.
Following are the major differences between "Dataset" and "Data Reader":-
(B) How can we load multiple tables in a Dataset?
  1. objCommand.CommandText = "Table1"
  2. objDataAdapter.Fill(objDataSet, "Table1")
  3. objCommand.CommandText = "Table2"
  4. objDataAdapter.Fill(objDataSet, "Table2")
Above is a sample code, which shows how to load multiple "Data Table" objects in one "Dataset" object. Sample code shows two tables "Table1" and "Table2" in object ObjDataSet.
  1. lstdata.DataSource = objDataSet.Tables("Table1").DefaultView
In order to refer "Table1" Data Table, use Tables collection of Datasets and the Default view object will give you the necessary output.
(B) How can we add a relation between tables in a Dataset?
  1. Dim objRelation As DataRelation
  2. objRelation = New DataRelation("CustomerAddresses", objDataSet.Tables("Customer").Columns("Custid"), objDataSet.Tables("Addresses").Columns("Custid_fk"))
  3. objDataSet.Relations.Add(objRelation)
Relations can be added between "Data Table" objects using the "Data Relation" object. Above sample, code is trying to build a relationship between "Customer" and "Addresses" "Data table" using "Customer Addresses" "Data Relation" object.
(B) What is the use of Command Builder?
Command Builder builds "Parameter" objects automatically. Below is a simple code, which uses a command builder to load its parameter objects.
  1. Dim pobjCommandBuilder As New OleDbCommandBuilder(pobjDataAdapter)
  2. pobjCommandBuilder.DeriveParameters(pobjCommand)
Be careful while using the "Derive Parameters" method as it needs an extra trip to the Datastore, which can be very inefficient
(B) What's the difference between "Optimistic" and "Pessimistic" locking?
In pessimistic locking when the user wants to update data it locks the record and till then no one can update data. Other users can only view the data when there is pessimistic locking.
In optimistic locking, multiple users can open the same record for updating, thus increase maximum concurrency. The record is only locked when updating the record. This is the most preferred way of locking practically. Nowadays in browser-based applications, it is very common, and having pessimistic locking is not a practical solution.
(A) How many ways are there to implement locking in ADO.NET?
Following are the ways to implement locking using ADO.NET:-
(A) How can we perform transactions in .NET?
The most common sequence of steps that would be performed while developing a transactional application is as follows:
(I) What is the difference between Dataset? Clone and Dataset. Copy?
(A) Can you explain the difference between an ADO.NET Dataset and an ADO Recordset?
There two main basic differences between recordset and dataset:-
(A) Explain in detail the fundamental of connection pooling?
When a connection is opened the first time, a connection pool is created and is based on the exact match of the connection string given to create the connection object. Connection pooling only works if the connection string is the same. If the connection string is different, then a new connection will be opened, and connection pooling will not be used.
Figure 9.5: - Connection Pooling action.
Let us try to explain the same pictorially. In the above figure, you can see there are three requests "Request1", "Request2", and "Request3". "Request1" and "Request3" have the same connection string so no new connection object is created for "Request3" as the connection string is the same. They share the same object "ConObject1". However, the new object "ConObject2" is created for "Request2" as the connection string is different.
Note: - The difference between the connection string is that one has "User id=sa" and the other has "User id=Testing".
(A)What is Maximum Pool Size in ADO.NET Connection String?
The maximum pool size decides the maximum number of connection objects be pooled. If the maximum pool size is reached and there is no usable connection available the request is queued until connections are released back into the pool. So it's always a good habit to call the close or dispose of the method of the connection as soon as you have finished work with the connection object.
(A)How to enable and disable connection pooling?
For .NET it is enabled by default but if you want to just make sure set Pooling=true in the connection string. To disable connection pooling set Pooling=false in the connection string if it is an ADO.NET Connection. If it is an OLEDBConnection object set OLE DB Services=-4 in the connection string.
(I) What extra features does ADO.Net 2.0 have?