一、使用SqlConnection类连接数据库
//需要添加如下的命名空间
using System.Data.SqlClient;
protected void Button1_Click(object sender, EventArgs e)
{
//ConnectionString定义了连接字符串
string ConnectionString = "Data Source=. ; Initial Catalog=Pubs; User ID=sa";
//使用连接字符串构造一个SqlConnection实例
SqlConnection conn = new SqlConnection(ConnectionString);
try
{
//打开连接
conn.Open();
//如果当前状态打开,在控制台输出
if (conn.State == ConnectionState.Open)
{
Label1.Text = "当前数据库已经连接!<br/>";
Label1.Text += "连接字符串为:" + conn.ConnectionString;
}
}
catch (SqlException ex)
{
Label1.Text = "当前数据库已经失败!<br/>";
Label1.Text += "失败的原因是:" + ex.Message;
}
finally
{
//调用Close方法即使关闭连接
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
}
二、使用SqlConnectionStringBuilder连接字符串
//引入如下名词空间
using System.Data.SqlClient;
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnectionStringBuilder connBuider = new SqlConnectionStringBuilder();
//DataSource表示数据源位置,可以是IP地址,也可以指定一个DNS名称
connBuider.DataSource = ".";
//InitialCataLog指定需要连接数据库的名称
connBuider.InitialCatalog = "Pubs";
//IntegratedSecurity表示是否使用整合身份验证进行登录数据库
connBuider.IntegratedSecurity = false;
//不使用整合Windows身份验证时,指定用户ID和密码
connBuider.UserID = "sa";
connBuider.Password = "";
//使用SqlConnetionStringBuilder.ToString()方法将会输出连接字符串
using(SqlConnection conn=new SqlConnection(connBuider.ToString()))
try
{
//打开连接
conn.Open();
//如果当前状态打开,在控制台输出
if (conn.State == ConnectionState.Open)
{
Label1.Text = "当前数据库已经连接!<br/>";
Label1.Text += "连接字符串为:" + conn.ConnectionString;
}
}
catch (SqlException ex)
{
Label1.Text = "当前数据库已经失败!<br/>";
Label1.Text += "失败的原因是:" + ex.Message;
}
finally
{
//调用Close方法即使关闭连接
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
}
三、关闭和释放连接
连接在关闭后应该尽早地释放,SqlConnection提供了Close方法,用于关闭一个连接。除此之外,SqlConnection的基类实现了 IDDispose接口的Dispose方法,这个方法不仅可以关闭一个连接,而且还可以清理连接所占用的资源。
连接可以关闭之后再次打开:
如:Open();
Close();
Open();
此执行不会出现任何问题,但是,若是连接释放后再打开
即:Open();
Dispose();
Open();
则会抛出异常。
四、在Web.config配置文件中保存连接字符串
连接信息最好保存在Web.config配置文件中,以便于维护和修改。在Web.config配置文件的<configuration>节添加如下代码:
<configuration>
<connectionStrings>
<add name="NorthwindConnectionString" connectionString="Data Source=. ;Initial Catalog=Northwind; User ID=sa;pwd="/>
</connectionStrings>
</configuration>
如果程序员不愿意手工创建这段代码,可以在页面上放置一个SqlDataSource控件,在该控件的任务窗口中选择配置数据源,根据提示一步步配置,出现如下图所示的提示后则连接字符串被保存到Web.config配置文件中
为了从Web.config中获取连接字符串,需要使用System.Web.ConfigurationManager类
//需要添加此名词空间
using System.Web.Configuration;
using System.Data.SqlClient;
protected void Button1_Click(object sender, EventArgs e)
{
//使用WebConfigurationManager获取Web.config配置文件中的连接字符串
string ConnectionString = WebConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;
//使用连接字符串构造一个SqlConnection实例
SqlConnection conn = new SqlConnection(ConnectionString);
try
{
conn.Open();
//如果当前连接状态打开,则显示打开成功的信息
if (conn.State == ConnectionState.Open)
{
lblInfo.Text = "当前数据库已连接!<br/>";
lblInfo.Text += "连接字符串为:" + ConnectionString;
}
}
catch (SqlException ex)
{
lblInfo.Text = "数据库连接失败!<br/>";
lblInfo.Text += "失败的原因是:" + ex.Message;
}
finally
{
//调用Close()方法即使地关闭连接
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
}
五、连接池技术
连接到数据库服务器通常需要一定的时间,且服务器也需要一定的资源来处理连接,Web应用程序有时处理成千上万的连接,需要相当多的资源来处理连接。 ADO.NET具有连接池的特性,连接池的功能是保留一定数量的连接,当用户使用相同的连接字符串再次连接服务器时,连接将返回到连接池 中,ADO.NET将使用连接池中的连接而不用重新发起一次连接过程。当调用Close方法关闭连接时,连接将会返回到连接池中,下次再次调用Open方 法时,将从连接池中取出一个连接使用。
使用连接池和不使用连接池的效果如下:
//使用连接池技术
protected void btnpool_Click(object sender, EventArgs e)
{
//指定连接字符串
String connectionstring = "Data Source=. ;Initial Catalog=Pubs ;User ID =sa;";
SqlConnection conn = new SqlConnection(connectionstring);
//获取在开始连接之前的时间刻度数
long startTicks = DateTime.Now.Ticks;
//依次打开和关闭100次连接
for (int i = 1; i <= 100; i++)
{
conn.Open();
conn.Close();
}
long endTicks = DateTime.Now.Ticks;
lblpool.Text = "使用连接池后所花费的时间是:" + (endTicks - startTicks).ToString() + "Ticks";
//使用完毕后释放连接
conn.Dispose();
}
//不使用连接池技术
protected void btnnopool_Click(object sender, EventArgs e)
{
//指定连接字符串.注意这里使用pooling=false禁用了连接池
String connectionstring = "Data Source=. ;Initial Catalog=Pubs ;User ID =sa;pooling=false";
SqlConnection conn = new SqlConnection(connectionstring);
//获取在开始连接之前的时间刻度数
long startTicks = DateTime.Now.Ticks;
//依次打开和关闭100次连接
for (int i = 1; i <= 100; i++)
{
conn.Open();
conn.Close();
}
long endTicks = DateTime.Now.Ticks;
lblnopool.Text = "不使用连接池后所花费的时间是:" + (endTicks - startTicks).ToString() + "Ticks";
//使用完毕后释放连接
conn.Dispose();
}
运行结果: