Click here to Skip to main content
6,595,854 members and growing! (17,929 online)
Email Password   helpLost your password?
Database » Database » General     Intermediate

Using ADO.NET programmatically with C#

By Umut ŞİMŞEK

An article on using Ado.NET programmatically
C#, SQL, VC8.0.NET 1.1, Win2K, WinXP, Win2003, Vista, ADO.NET, SQL 2000, VS.NET2003, DBA, Dev
Posted:3 Dec 2005
Updated:15 Dec 2005
Views:55,966
Bookmarked:26 times
Unedited contribution
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
29 votes for this article.
Popularity: 3.69 Rating: 2.52 out of 5
9 votes, 31.0%
1
4 votes, 13.8%
2
1 vote, 3.4%
3
3 votes, 10.3%
4
12 votes, 41.4%
5

Sample image

Introduction

In my article, I will explain basic concepts of MS ADO.NET and how to involve them programmatically.

Background

It is well known that Visual Studio .NET supports developers with many wizards. One of them is Data Form Wizard. If you want to create forms involving single and master detail data bases, this tool will give you many detailed and interesting opportunities while creating your form. But when you are developing real-world applications generally you have to face altering these standard methods to match your target application requirements. Therefore you need to write some code making your application flexible. Here is an example on using ADO.NET fully programmatically with C#.

Using the code

The program uses a simple SQL database named �Library� and a table named �Books� in it. We have a few ways to create this database. After receiving a request, I decided to write some code to create the necessary database programmatically. I added a menu item Settings->Create Database to create the database.

public void CreateDatabase()
{	
	string sCreateDatabase="CREATE DATABASE Library";			
	string sCreateTable="CREATE TABLE Books (BookID INTEGER PRIMARY KEY IDENTITY,"+
		"Title CHAR(50) NOT NULL , Author CHAR(50), PageCount INTEGER,Topic CHAR(30),Code CHAR(15))" ; 
	string sInsertFirstRow="INSERT INTO BOOKS (TITLE,AUTHOR,PAGECOUNT,TOPIC,CODE)" 
		+"VALUES('Test Book','Test Author', 100, 'Test Topic', 'Test Code');";
	
	SqlConnection mycon=new SqlConnection();
	mycon.ConnectionString="workstation id=;initial catalog=; integrated security=SSPI";

	SqlCommand mycomm=new SqlCommand();
	mycomm.CommandType=CommandType.Text;
	mycomm.CommandText=sCreateDatabase;
	mycomm.Connection=mycon;

	try
	{
		//	Open the connection

		mycon.Open();
		//	Execute CreateDatabase query

		mycomm.ExecuteNonQuery();
	}
	catch
	{
		//	Catch any errors and show the error message

		MessageBox.Show(" The database already exists. ");
	}	
	finally
	{
		mycon.Close();
	}
		
	mycon.ConnectionString="workstation id=;initial catalog=Library; integrated security=SSPI";
	try
	{
		//	Open the connection

		mycon.Open();
		//	Execute CreateTable query

		mycomm.CommandText=sCreateTable;
		mycomm.ExecuteNonQuery();
		//	Execute InsertFirstRow query

		mycomm.CommandText=sInsertFirstRow;
		mycomm.ExecuteNonQuery();
	}
	catch
	{
		//	Catch any errors and show the error message

		MessageBox.Show(" There is already a table named 'Books' in the database. ");
	}
	finally
	{
		mycon.Close();
	}
}	

We can also do this via MS Visual Studio .NET or MS SQL Server Manager. Let us create a Books table in Library database. And here are table columns:

Column Name

Data Type

Length

Allow nulls

BookID

int

4

 

Title

char

50

 

Author

char

50

V

PageCount

int

4

V

Topic

char

30

V

Code

char

15

V

First of all, to move data between a data store and our application, we must have a connection to the data store. We will use Connection object of ADO.NET to create and manage the connection. Because our data source is SQL Server we use SqlConnection.

SqlConnection mycon=new SqlConnection();

To determine the settings we must use the ConnectionString property.

mycon.ConnectionString="workstation id=;initial catalog=LIBRARY; integrated security=SSPI";

DataSet is a memory-resident representation of data and can include table(s) constraint(s) and relationship(s).

DataSet myds=new DataSet();

A DataAdapter is used to retrieve data from a data source and populate within a DataSet and to resolve changes made to the DataSet back to the data source. We can also say simply, interaction with data source(s) and dataset(s) is controlled through the DataAdapter.

SqlDataAdapter myadap=new SqlDataAdapter();

A DataTable is used for representing a single table of memory-resident data. In our project as we have only one table in our database, we must create a table as a presentation of the table in our database and add it to our DataSet object.

DataTable mytable=new DataTable("books");

myds.Tables.Add(mytable);

A Command object is used to access data directly in the database in a connected environment. CommandType is declared as Text. CommandText is a SQL statement.

mycomm SqlCommand =new SqlCommand();
mycomm.CommandType=CommandType.Text;
mycomm.CommandText="SELECT TITLE,AUTHOR,PAGECOUNT,TOPIC,CODE FROM BOOKS";

To be able to declare and use these ADO.NET objects we must include System.Data and System.Data.SqlClient namespaces in our application.

using System.Data;
using System.Data.SqlClient;

Indeed we have two options. We can manipulate data through DataAdapter object using Fill and Update methods. We used Fill method loading and searching data in our application because of its simplicity. As a second option, we can use SqlConnection and SqlCommand to access our data directly. It is faster than the first. This method is used to insert, delete and modify functions with the ExecuteNonQuery method of the Command object. We can create a class and put all necessary code and make some necessery items public in obtain to reach from everywhere in our namespace.

public class dataManipulationClass
{
	public SqlConnection mycon;
	public DataSet myds;
	public DataTable mytable;
	public SqlDataAdapter myadap;
	public SqlCommand mycomm;		

	public bool ManupulateData()
	{
		mycon=new SqlConnection();
		mycon.ConnectionString="workstation id=;initial catalog=LIBRARY;
			integrated security=SSPI";
					
		myds=new DataSet();
		mytable=new DataTable("books");
		myds.Tables.Add(mytable);
		myadap=new SqlDataAdapter();

		mycomm=new SqlCommand();
		mycomm.CommandType=CommandType.Text;
		mycomm.CommandText="SELECT TITLE,AUTHOR,PAGECOUNT,TOPIC,CODE FROM BOOKS";
		mycomm.Connection=mycon;
		myadap.SelectCommand=mycomm;

		return true;
	}
}

To use class in FormMain class, we must declare it.

dataManipulationClass cDataMan=new dataManipulationClass();

To load data we have a simple LoadData function

public void LoadData()
{
	//	Call method to initialize the parameters of dataManipulationClass object

	cDataMan.ManupulateData();
	//	Bound dataGrid to dataset 

	dataGrid.DataSource=cDataMan.myds;
	//	Set DataMember to books table

	dataGrid.DataMember="books";		
	try
	{
		//	Get data from table and fill the table in the dataset via dataadapter

		cDataMan.myadap.Fill(cDataMan.mytable);
	}
	catch(Exception xcp)
	{
		//	Catch any errors and show the error message

		MessageBox.Show(xcp.ToString());
	}
	finally
	{
		//	Close the connection

		cDataMan.mycon.Close();
	}
}

DeleteData and ModifyData functions are very similar to AddData except their connection string.
Connection string is for DeleteData function:

cDataMan.mycomm.CommandText="DELETE FROM BOOKS WHERE BOOKID=@BookID";

A SqlParameter is added to the string for BookID.

cDataMan.mycomm.Parameters.Add(new SqlParameter("@BookID",sBookID));

Connection string is for ModifyData function:

cDataMan.mycomm.CommandText="SELECT TITLE,AUTHOR,PAGECOUNT,"
	+"TOPIC,CODE FROM BOOKS WHERE TITLE=@Title";

A SqlParameter is added to the string.

cDataMan.mycomm.Parameters.Add(new SqlParameter("@Title",sTitle));

Conclusion

I think, the code can be used for generating codes and an application without design-time data objects replacements and wizard-free application development which generates sometimes unclear code. The code is simple but of course should be improved to overcome your real-time problems. I know that there are a lot of things to do with my code. I am planning to improve my code in the future and expect your help.

History

� 14 Dec 2005 Created paramaterized sql queries. Added database creation feature to create the necessary database for this article. Fixed delete and modify functions to invoke exact selection on the datagrid.

� 03 Dec 2005 Initial revision.

Sources

� http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconpopulatingdatasetfromdataadapter.asp

� 2555A Developing Microsoft .NET Applications for Windows

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Umut ŞİMŞEK


Member
Started writing code in 1988. There were GW Basic, Turbo Pascal, Turbo C under DOS.
While studentship there were Assembly, C++, digital electronics, microprocessors..in the scene as new things. Then next versions, next generations like Visual Basic, Delphi, C++ Builder, next platforms like Windows, Win32, Linux. Last years many projects took place using various tech and under various platforms. New technologies and IDEs like Delphi 2005, Visual Studio 2003, 2005, C#, ASP.NET, ADO.NET, Metodologies and Tools like UML, Starteam..

Occupation: Software Developer (Senior)
Location: Turkey Turkey

Other popular Database articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 17 of 17 (Total in Forum: 17) (Refresh)FirstPrevNext
JokeThanks so much! PinmemberAn Huy Hoang7:39 3 Sep '09  
Generaldispose PinmemberBilly Jean again8:10 20 Dec '05  
GeneralRe: dispose PinmemberL-NRG23:09 26 Dec '05  
Generalinteresting code PinmemberJong G Andr0:14 17 Dec '05  
GeneralRe: interesting code PinmemberL-NRG4:23 20 Dec '05  
GeneralNo source code PinmemberPeter Kohout1:18 16 Dec '05  
Generalsource code PinmemberL-NRG9:22 16 Dec '05  
GeneralSource code and image PinmemberAxelM21:53 15 Dec '05  
GeneralRe: Source code and image PinmemberL-NRG9:38 16 Dec '05  
GeneralRe: Source code and image PinmemberAxelM10:08 16 Dec '05  
GeneralRe: Source code and image PinmemberL-NRG23:25 16 Dec '05  
Generalsome useful info Pinmemberbefast20:57 14 Dec '05  
Generalteaches bad practices PinmemberRob Graham10:40 3 Dec '05  
GeneralRe: teaches bad practices Pinmembercomputerguru9238214:19 3 Dec '05  
GeneralRe: teaches bad practices PinmemberL-NRG20:55 6 Dec '05  
GeneralRe: teaches bad practices Pinmembercomputerguru923826:10 7 Dec '05  
GeneralRe: teaches bad practices PinmemberMike Elliott9:43 19 Dec '05  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 15 Dec 2005
Editor:
Copyright 2005 by Umut ŞİMŞEK
Everything else Copyright © CodeProject, 1999-2009
Web20 | Advertise on the Code Project