Introduction
ADO.NET is the .NET enhanced version of ADO that we all know and love.
ADO.NET aims to address some of the deficiencies of traditional ADO and present
a model that provides type safety, OOP, and efficiency.
This article will demonstrate the most common task when accessing a database:
querying for data and traversing that data from start to finish in order to
display the contents (or subset thereof) of a table.
The DataReader class
ADO.NET replaces the concept of data rows with the
DataSet
object. This essentially provides us with full access to a given
database, including all rows, tables and relationships in an object oriented and
type-safe manner. It is, however, total overkill for the simple query and
traversals that are most often performed on databases.
For this simple case .NET provides us with the DataReader
class
(OleDbDataReader
, OdbcDataReader
and
SqlDataReader
) that is essentially a type safe read only, forward
only rowset. The differences between the various flavours of
DataReader
s is in which data access library they use.
SqlDataReader
works best with SQL Server, while the others work
best with ODBC and OleDB data srouces.
All we need to do is open a connection to a database, send an SQL command,
then traverse through the resultant DataReader
using the
Read
command and process the results.
The easiest way to illustrate this is to show you some code. This snippet
opens an Access database, reads all the information from a table, then populates
a List View control with the data inside.
A few notes on the code:
StatusText
and fileName
are
RichTextBox
controls declared as
private System.Windows.Forms.RichTextBox fileName;
private System.Windows.Forms.RichTextBox StatusText;
listView
is a list view control declared as
System.WinForms.ListView listView;
listView = new System.Windows.Forms.ListView ();
The list view has been placed in details mode using
listView.View = System.Windows.Forms.View.Details;
The Code
OleDbConnection Connection = new OleDbConnection ();
try
{
Connection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + fileName.Text + ";" +
"Persist Security Info=False;";
Connection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = Connection;
command.CommandText = "SELECT * FROM Authors";
OleDbDataReader dataReader;
dataReader = command.ExecuteReader(CommandBehavior.CloseConnection);
int nFields = dataReader.FieldCount;
listView.Clear();
for (int i = 0; i < nFields; i++)
{
listView.Columns.Add(dataReader.GetName(i), 100,
HorizontalAlignment.Left);
}
int nRow = 0;
while (dataReader.Read())
{
String [] subitems = new String[nFields];
for (int i = 0; i < nFields; i++)
{
subitems[i] = dataReader[i].ToString();
}
ListViewItem item = new ListViewItem(subitems, -1);
listView.Items.Add(item);
++nRow;
}
dataReader.Close();
StatusText.Text = nFields.ToString() + " columns, " +
nRow.ToString() + " rows read";
}
catch (Exception ex)
{
StatusText.Text = "Error: " + ex.Message;
}
finally
{
if (Connection.State == System.Data.ConnectionState.Open)
Connection.Close();
}
That's all there is to it. We have closed the database connection but since
we are using managed code there is no need (or way) to delete the objects and
memory we allocated.
History
23 Aug 2003 - Updated to .NET 1.0/1.1. Previous version was for .NET beta
1.
Chris Maunder is the co-founder of
CodeProject, DeveloperMedia and ContentLab, and has been a prominent figure in the software development community for nearly 30 years. Hailing from Australia, Chris has a background in Mathematics, Astrophysics, Environmental Engineering and Defence Research. His programming endeavours span everything from FORTRAN on Super Computers, C++/MFC on Windows, through to to high-load .NET web applications and Python AI applications on everything from macOS to a Raspberry Pi. Chris is a full-stack developer who is as comfortable with SQL as he is with CSS.
In the late 1990s, he and his business partner David Cunningham recognized the need for a platform that would facilitate knowledge-sharing among developers, leading to the establishment of CodeProject.com in 1999. Chris's expertise in programming and his passion for fostering a collaborative environment have played a pivotal role in the success of CodeProject.com. Over the years, the website has grown into a vibrant community where programmers worldwide can connect, exchange ideas, and find solutions to coding challenges. Chris is a prolific contributor to the developer community through his articles and tutorials, and his latest passion project,
CodeProject.AI.
In addition to his work with CodeProject.com, Chris co-founded ContentLab and DeveloperMedia, two projects focussed on helping companies make their Software Projects a success. While at CodeProject, Chris' roles included Architecture and coding, Product Development, Content Creation, Community Growth, Client Satisfaction and Systems Automation, and many, many sales meetings. All while keeping his sense of humour.