对于ADO.NET而言,不同的数据源,都对应着不同的Connection对象。具体Connection对象如下表:
名称 命名空间 描述
SqlConnection System.Data.SqlClient 表示与SQL Server的连接对象
OleDbConnection System.Data.OleDb 表示与OleDb数据源的连接对象
OdbcConnection System.Data.Odbc 表示与ODBC数据源的连接对象
OracleConnection System.Data.OracleClient 表示与Orale数据库的连接对象
上述不管哪种连接对象,它都继承于DbConnection类。
public abstract classDbConnection : Component, IDbConnection, IDisposable
可以看出DbConnection是抽象基类,不能实例化。
常见属性:
ConnectionString: 获取或设置用于打开连接的字符串。
Database: 在连接打开之后获取当前数据库的名称,或者在连接打开之前获取连接字符串中指定的数据库名。
DataSource: 获取要连接的数据库服务器的名称。
ConnectionTimeOut:获取在建立连接时终止尝试并生成错误之前所等待的时间。
State: 描述了与数据源的连接的当前状态。
ConnectionState是一个枚举类型。它包括以下成员:
Closed: 连接处于关闭状态。
Open: 连接处于打开状态。
Connecting: 连接对象正在与数据源连接。
Executing: 连接对象正在执行命令。
Fetching: 连接对象正在检索数据。
Broken: 与数据源的连接中断。
常用方法:
Open: 使用 ConnectionString 所指定的设置打开数据库连接。
Dispose: 释放由 Component 使用的所有资源。
Close: 关闭与数据库的连接。 此方法是关闭任何已打开连接的首选方法。Close 方法回滚任何挂起的事务。 然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接。
案例:连接SQL Server的SqlConnection对象
using System;
usingSystem.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
usingSystem.Data.SqlClient;
namespace connDb1
{
class Program
{
static void Main(string[] args)
{
//构造连接字符串
SqlConnectionStringBuilder connStr = new SqlConnectionStringBuilder();
connStr.DataSource = "192.168.1.20";
connStr.InitialCatalog = "rzerp_zjsy";
connStr.UserID = "developer";
connStr.Password = "developer";
SqlConnectionconn = new SqlConnection(); //创建连接对象
conn.ConnectionString =connStr.ConnectionString;//设置连接字符串
conn.Open();//打开连接
if(conn.State == ConnectionState.Open)
{
Console.WriteLine("Database is linked.");
Console.WriteLine("\nDataSource:{0}", conn.DataSource);
Console.WriteLine("\nDatabase:{0}", conn.Database);
Console.WriteLine("\nConnectionTimeOut:{0}",conn.ConnectionTimeout);
Console.WriteLine("\nConnectionState:{0}", conn.State);
}
conn.Close();//关闭连接
conn.Dispose(); //释放资源
if(conn.State == ConnectionState.Closed)
{
Console.WriteLine("\nDatabase is closed.");
}
}
}
}
运行结果如下:
增强连接SQL Server的代码安全性
连接数据库时,可能出现异常,因此需要添加异常处理。对于C#来说,典型的异常处理是添加try...catch代码块。finially是可选的,finially是指无论代码是否出现异常都会执行的代码块。
在finially语句块中调用Close方法关闭数据库连接,确保打开连接后,无论是否出现异常,都关闭连接和释放资源。
上案例中修改代码如下:
try
{
conn.Open(); //打开连接
if (conn.State == ConnectionState.Open)
{
Console.WriteLine("Database is linked.");
Console.WriteLine("\nDataSource:{0}", conn.DataSource);
Console.WriteLine("\nDatabase:{0}", conn.Database);
Console.WriteLine("\nConnectionTimeOut:{0}", conn.ConnectionTimeout);
Console.WriteLine("\nConnectionState:{0}", conn.State);
}
}
catch(Exception ex)
{
Console.WriteLine("\nLink Database error:{0}",ex.Message);
}
finally
{
conn.Close(); //关闭连接
conn.Dispose();
}