http://blog.csdn.net/jabby12/archive/2004/08/03/59602.aspx 在ADO.NET对象模型中,Connection对象代表了与数据源之间的连接。.NET框架中有两个Connection对象:一个是OleDbConnection,用于大多数的数据库连接,一个是SqlConnection,是MS开发的专门用于针对SQL Server的连接。在创建Connection对象之前,你必须先引用System.Data.OleDb或者System.Data.SqlClient和System.Data三个名空间。
1.SQL Server数据库的连接
你可以使用Connection对象的属性来指定数据源的位置及其它参数来连接数据库。如:SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;use id=yourid,password=yourpassword;");
这是连接到本地数据库,如果你想连到网络上的的数据库,就要利用集成安全性,同时忽略用户名和密码。如:
SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");
如果使用的是ODBC连接到SQL Server,可以通过使用Trusted_Connection=yes;来使用网络数据库。
2.Oracle数据库的连接:(前提:必须先安装Oracle客户端实用工具的适当版本,并创建数据库别名,接着就可以用以下的连接字符串进行连接)
SqConnection con=new SqlConnection("Provider=MSDAORA;Data Source=dbAlias;User id=yourid,password=youpwd;);
3.Access数据库的连接:(你可以使用以下连接字符串来连接)
SqConnection con=new SqlConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\yourdb.mdb;User id=yourid,password=youpwd;);
连接到数据库之后即可调用Connection对象的Open()方法来打开与数据库的连接,同理Close()方法用来关闭与数据库的连接。
连接池:
连接池是什么?在一个三层结构(或N层)中,当一个客户端与中间层服务器进行通讯的时候,服务器会创建一个与数据库连接,并执行操作的业务对象(也就是与数据库连接的实例),同时会创建一个Connection对象,在放在一个池中(实际上是一个线程)。当释放这个实例的时候,此实例便关闭,此时并没有真正的关闭数据连接,而是将Connection对象标记为关闭后存储在池中。如果这时再来启动一个新的业务对象,这时就会检查现有的连接,如果池中有打开的连接,即使用它,否则再创建一个新连接。
可能你会觉得很奇怪,如果这样,那池中不是有很多的对象,岂不是会浪费很多的资源,这个问题的解决方案是你可以设置与数据库的特定连接时间(默认60秒),如果在这个时间内未被使用,.NET提供就会关闭此连接。
如何打开连接池?默认情况下是打开的.
如何关闭连接池?可以使用OleDbConnection.ReleaseConnectionPool()方法来关闭连接池,更或者你可以在OLE DB连接字符串中加上OLE DB Services= - 4;在用SqlConnection对象时可在连接符中加上Pooling=False。这时你再调用Close()时候便会真正地关闭与数据库的连接。
(注1:可以使用SQL事件探查器或性能监视器来观察连接到数据库中的连接数目,以识别连接是否真正关闭或是只是放入池中。)
(注2:可以显式调用Dispose()方法在垃圾收集器回收之前释放资源,但如果你只是将Connection对象设为NULL的话,是不会断开与数据源的连接的)
利用Connection对象来创建Command对象:(ADO.NET中用Command对象来执行数据查询,更新)例 :
SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");
using (OleDbCommand cmd=con.CreateCommadn())
{
cmd.CommandText="select * from table";
cmd.ExecuteNonQuery();
}
(注:此处使用using 的好处是在进行此次操作后便可释放资源。)
利用Connection对象来创建Transaction对象:(Transaction对象是ADO.NET中的事务管理对象)
例:
SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");
con.Open();
OleDbTransaction tran=con.BeginTransaction(); (注:调用此方法会在连接时返回一个新的打开的Transaction对象来进行事务管理)
(注:事务是指一组单一实体运行的语句,可以确保数据的完整性,防止因系统故障或其它原因而引起的数据丢失。概念很抽象,呵呵,看下去就明白了)
事务有ACID四个属性(即原子性,一致性,隔离性,持久性):
原子性指在执行事务过程中,这个过程要么成功执行,要么不执行。
一致性指事务前和事务后的数据的一致性,也就是如果事务成功执行的话,系统就返回成功的状态,即所有数据的改变标记为已完成,如没完成事务,即回滚,并回到先前的合法状态。
隔离性指一个事务内的任何变化都独立于其它的事务(相对于两个事务的说法)
持久性指事务是持续的,也就是事务成功完成后的改变是永久的。
(注:事务有手动和自动两种,本文的主题不在此,事务的介绍在其它篇章会涉及到)
取得数据库的架构信息:
有时你会发觉有需要获取数据库的架构信息来方便程序的运行。可使用OleDbConnection对象的GetOleDbSchemaTable()方法来获取,它需要一个参数用来作返回的架构信息的过滤器,即只获取表中的列或行信息,不写此参数则获取整个表所有列的信息。
例:
OleDbConnectioncon=new OleDbConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");
con.Open();
DataTable dt=con.GetOleDbSchemaTable(OleDbSchamaGuid,null);
foreach(DataRow row in dt.Rows)
Console.WriteLine(row["column_name"].ToString());
---------------------------------------------------------------
关于AD.NET的连接对象还有很多有用的方法,具体查MSDN。