DataReader Class
A DataReader object allows forward-only, read-only access to a database. Different properties and strategies for the Command classes are saved for later exercises. Each provider has its own version of DataReader which inherits the System.Data.Common.DbDataReader base class.
Provider | DataReader class |
---|---|
SQL Server | SqlDataReader |
OLE DB | OleDbDataReader |
ODBC | OdbcDataReader |
Figure 1 – DataReader Classes
The DbDataReader class contains properties and methods used for reading a row in a database table. Some of this is presented in the following tables.
Property | Description |
---|---|
FieldCount | Specifies the number of columns of the current row or record. |
HasRows | Specifies whether the current row has at least 1 row. |
IsClosed | Specifies whether the DbDataReader is closed. |
RecordsAffected | Specifies the number of rows that have been updated, inserted, or deleted. |
Figure 2 – DbDataReader Properties
Method | Description |
---|---|
GetBoolean | Gets the value of a column as a boolean value. |
GetChar | Gets the value of a column as a char value. |
GetDataTypeName | Gets the name of the data type of the current column. |
GetDateTime | Gets the value of the column as a DateTime object. |
GetDecimal | Gets the value of the column as a decimal value. |
GetDouble | Gets the value of the column as a double value. |
GetFieldType | Gets the field type of the specified column. |
GetInt32 | Gets the value of the column as an int value. |
GetName | Gets the name of the column. |
GetOrdinal | Gets the column ordinal with the specified column name. |
GetString | Gets the value of the column as a string value. |
GetValue | Gets the value of a column as an object. |
GetValues | Gets all the column of a row as an array of objects. |
NextResult | Advances the reader to the following outcome when reading the aftereffects of a result of proclamations. |
Read | Advances the reader to the next record. |
Figure 3 – DbDataReader Methods
The DataReader only loads a single row in the memory at a time to ensure the minimum use of memory. DataReader can only be used when a connection is open, so you need to open a connection first and as soon as you are done using it, then you must close the connection. A corresponding command assigned with an SQL SELECT statement should call the ExecuteReader() method to create an instance of DbDataReader object. Again, we will use the SQL Server provider for the following examples. (Suppose that a connection was already declared).
SqlCommand command = new SqlCommand("SELECT * FROM Students", connection);
SqlDataReader reader;
connection.Open();
reader = command.ExecuteReader();
You can see that we first need an Open connection before using the ExecuteReader() method. We did this using the DbConnection.Open() method. An overloaded version of the ExecuteReader() method also exists that accepts a value from the System.Data.CommandBehavior enumeration. Here are some of its values you can use.
Value | Description |
---|---|
CloseConnection | Immediately closes the connection when the Close method of the DataReader is called. |
Default | The default behavior of the DataReader. |
SingleResult | The query returns a single result set. |
SingleRow | The query is expected to return only a single row. |
Figure 4 – System.Data.CommandBehavior Enumeration Values
For example, if you want the reader to only read a single row, then you should pass the SingleRow value to the ExecutReader()method.
reader = command.ExecuteReader(CommandBehavior.SingleRow);
You can also combine command behaviors using the bitwise OR operator.
reader = command.ExecuteReader(CommandBehavior.SingleRow | CommandBehavior.CloseConnection);
Once the ExecuteReader() was executed and an instance of DbDataReader was placed in a variable, we can now iterate through each record of the result set that was returned bySELECT statement. The accompanying demonstrates to you proper methodologies to acquire the estimation of each field of each line.
while (reader.Read())
{
MessageBox.Show(reader["FirstName"].ToString());
}
We used a for loop and inside its condition, we used the Read() method of the DataReader to read the first row of the result set that was returned by the query. If a row was successfully read, the method will return true and continue the loop. Once that method is executed, we can use an indexer for the DataReader object and pass the name of the column. This will come back the result as Associate in Nursing object, therefore, we want to convert it 1st to its correct knowledge sort. After the body of the loop is executed, the Read() method is executed once again to read the next row. If there the row previously read is the last row and no other rows left to be read, then the Read() method will return false and stop the loop. Alternatively, you can use the Get methods of the DataReader which accepts the column index of the value to be retrieved. For example, suppose we want to retrieve the StudentId which is a number, then you can use the following code.
int studentID = reader.GetInt32(0);
This will return the value of the first column (index 0) as a value of type int.
After using the DataReader, you need to close the DataReader and the Connection to release the resources that were used and to make the connection available.
reader.Close();
connection.Close();
We will use the DataReader classes to read the contents of a database in a connected fashion and it will be demonstrated in a later lesson.