6.2 Connection类
前面已经介绍过,Connection类用于建立与特定数据源的连接,在对数据源的数据执行任何操作前必须建立连接,包括读取、删除、新增或者更新数据等。所有Connection对象的基类均为DbConnection类。
6.2.1 连接字符串
在ADO.NET中,无论连接什么数据源,都得先创建一个对数据源的连接对象,即Connection对象。而创建Connection对象时,就必须需要提供一个连接字符串。连接字符串的语法结构很简单,无论什么数据提供程序,都需要在连接字符串中提供以下基本信息,这些基本信息使用分号(;)隔开。
1)服务器地址((Dta Source或者server)。服务器地址标识数据库服务器的地址,其值可以是IP地址、计算机名称与localhost。localhost通常用于数据库服务器和ASP.NET应用程序位于同一台计算机之上,也可以使用“Data Source=.”来代替Data Source=localhost。
2)数据库名称((Iitial Catalog或者database)。数据库名称标识ASP.NET应用程序所使用的数据库名称,如Initial Catalog=ASPNET4或者database=ASPNET4。
3)如何通过数据库验证。在使用SQL Server或者Oracle数据提供程序时,可以选择提供验证身份或者以当前用户身份登录。一般情况下选择以当前用户身份登录,因为这样不需要在代码或者配置文件中输入密码。
一般情况下,建议使用Windows身份验证(也可以称为“集成安全性”)连接到支持的数据源。连接字符串中使用的语法根据提供程序的不同而不同。表6-4演示用于.NET Framework数据提供程序的Windows身份验证语法。
1.SqlClient连接字符串
SqlConnection连接字符串的语法记录在ConnectionString属性中。可以使用ConnectionString属性来获取或设置针对SQL Server 7.0或更高版本的数据库的连接字符串。如果需要连接到早期版本的SQL Server,则必须使用适用于OleDb的.NET Framework数据提供程序((Sstem.Data.OleDb)。
例如,下列各个语法形式都将使用Windows身份验证连接到本地服务器上的ASPNET4数据库。
"Persist Security Info=False;Integrated Security=true;
Initial Catalog=ASPNET4;Data Source=localhost"
"Persist Security Info=False;Integrated Security=SSPI;
database=ASPNET4;server=((lcal)"
在上面的连接字符串中,Persist Security Info关键字的默认设置为false。如果将其设置为true或yes,则允许在打开连接后通过连接获取安全敏感信息(包括用户ID和密码)。始终将Persist Security Info设置为false,以确保不受信任的源无法访问敏感的连接字符串信息。因此,为了书写简单,一般省略Persist Security Info关键字,如下面的代码所示:
"Integrated Security=true;
Initial Catalog=ASPNET4;Data Source=localhost"
"Integrated Security=SSPI;
database=ASPNET4;server=((lcal)"
一般情况下,很少使用Windows身份验证来连接到SQL Server,而大多是采用SQL Server身份验证,即指定用户名和密码。如下面的代码所示:
"Initial Catalog=ASPNET4;Data Source=localhost;
User ID=sa;Password=mawei;"
"database=ASPNET4;server=((lcal)User ID=sa;Password=mawei;"
除此之外,还可以连接并附加到SQL Server Express用户实例。用户实例是仅在SQL Server 2005以上速成版中提供的新功能。它们允许以最低权限的本地Windows账户运行的用户附加并运行SQL Server数据库,而无须具有管理权限。使用用户Windows凭据执行用户实例,而不是作为服务执行用户实例。
若要生成用户实例,必须运行SQL Server Express的父实例。安装SQL Server Express后,默认情况下将启用用户实例,且对父实例执行sp_configure系统存储过程的系统管理员可以显式启用或禁用用户实例。如下面的代码所示:
——Enable user instances.
sp_configure'user instances enabled','1'
——Disable user instances.
sp_configure'user instances enabled','0'
值得注意的是,用于用户实例的网络协议必须为本地命名管道。无法对SQL Server的远程实例启动用户实例,且不允许使用SQL Server登录名。
现在,就可以通过下面的连接字符串示例来连接并附加到SQL Server Express用户实例。
Data Source=.\SQLExpress;Integrated Security=true;
User Instance=true;
AttachDBFilename=|DataDirectory|\InstanceDB.mdf;
Initial Catalog=ASPNET4;
上述连接字符串中的关键字含义如下所示:
1)Data Source关键字是指生成用户实例的SQL Server Express的父实例。默认实例为.\sqlexpress。
2)Integrated Security设置为true。若要连接到用户实例,需要Windows身份验证;它不支持SQL Server登录名。
3)User Instance设置为true,这样就可调用用户实例。(默认值为false。)
4)AttachDbFileName连接字符串关键字用于附加主数据库文件((mf),该文件必须包含完整路径名。AttachDbFileName还与SqlConnection连接字符串中的“extended properties”和“initial file name”键相对应。
5)包含在管道符号中的|DataDirectory|替代字符串引用打开连接的应用程序的数据目录,并提供指示.mdf和.ldf数据库和日志文件的位置的相对路径。如果要在其他位置查找这些文件,则必须提供这些文件的完整路径。
2.OleDb连接字符串
OleDbConnection的ConnectionString属性允许获取或设置OLE DB数据源(如Microsoft Access、SQL Server 6.5或更早版本)的连接字符串。与SqlConnection不同,必须为OleDbConnection连接字符串指定提供程序名称。
如下列连接字符串使用Jet提供程序连接到Microsoft Access数据库。注意,如果数据库未受到保护(默认值),可选择UserID和Password关键字。如下面的代码所示:
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=d:\Northwind.mdb;User ID=Admin;Password=;
如果使用用户级安全保护Jet数据库,则必须提供工作组信息文件(.mdw)的位置。工作组信息文件用于验证连接字符串中显示的凭据,如下面的代码所示:
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=d:\Northwind.mdb;
Jet OLEDB:System Database=d:\NorthwindSystem.mdw;
User ID=*;Password=*;
对于SQL Server 6.5版或更低版本,请将sqloledb用做Provider关键字,如下面的代码所示:
Provider=sqloledb;Data Source=MySqlServer;
Initial Catalog=pubs;User Id=*;Password=*;
同样还可以使用Microsoft Jet提供程序连接到Excel工作簿。下列连接字符串中的Extended Properties关键字会设置特定于Excel的属性。“HDR=Yes;”指示第一行包含列名称,但不包含数据;“IMEX=1;”指示驱动程序始终将“intermixed”数据列作为文本进行读取。
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=D:\MyExcel.xls;
Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""
值得注意的是,Extended Properties所需的双引号字符还必须包含在双引号中。
除此之外,还可以使用Data Shape提供程序来连接到SQL Server的本地实例,如下面的代码所示:
Provider=MSDataShape;Data Provider=SQLOLEDB;
Data Source=((lcal);Initial Catalog=pubs;
Integrated Security=SSPI;
3.Oracle连接字符串
相对于SqlClient, Oracle连接字符串很简单,可以使用OracleConnection的ConnectionString属性来获取或设置数据源的连接字符串。连接字符串示例如下面的代码所示:
Data Source=Oracle10g;Integrated Security=yes;
或者
Data Source=Oracle10g;User ID=*;Password=*;
6.2.2 连接字符串和配置文件
在ASP.NET中,可以使用Web.config文件的<connectionStrings>节点来保存这些连接字符串,以便程序可以方便调用。如下面的代码示例所示:
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="ConnectionString"connectionString="server=.;
database=ASPNET4;uid=sa;pwd=mawei;"/>
</connectionStrings>
<system.web>
<compilation debug="true"targetFramework="4.0"/>
</system.web>
</configuration>
在Web.config文件里定义好连接字符串之后,就可以通过ConfigurationManager或者WebConfigurationManager类读取这些连接字符串。
关于ConfigurationManager和WebConfigurationManager类,我们已经在第1章做过比较详细的阐述。其中,ConfigurationManager类属于System.Configuration命名空间所有。调用方法如下:
string connectionString=
ConfigurationManager.ConnectionStrings
["ConnectionString"].ConnectionString;
WebConfigurationManager类属于System.Web.Configuration命名空间所有。调用方法如下:
string connectionString=
WebConfigurationManager.ConnectionStrings
["ConnectionString"].ConnectionString;
注意 如果编写的数据库操作通用类库仅仅只应用于Web应用程序,即ASP.NET程序,建议使用WebConfigurationManager类;如果编写的数据库操作通用类库不但要应用于Web应用程序,而且还需要在Windows应用程序里应用,建议使用ConfigurationManager类。
6.2.3 打开与关闭连接
获取到连接字符串之后,就需要使用Connection对象来建立与特定数据源的连接,并使用Open()方法来打开这个连接。
在这里需要特别说明的是,连接是有限的服务器资源,在使用连接时要遵循“晚打开,早释放”的原则。因此,必须通过调用Close()或Dispose()方法来显式关闭该连接。Close()和Dispose()在功能上等效。
下面的示例演示了如何使用Open()和Close()方法来打开与关闭连接。
public partial class WebForm1:System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string connectionString=
WebConfigurationManager.ConnectionStrings
["ConnectionString"].ConnectionString;
SqlConnection con=new SqlConnection(connectionString);
try
{
con.Open();
Label1.Text="<b>ServerVersion:</b>"
+con.ServerVersion;
Label1.Text+="<br/><b>State:</b>"+con.State;
}
catch(Exception ex)
{
Label1.Text+="<br/><b>异常信息:</b>"+ex.Message;
}
finally
{
con.Close();
Label1.Text+="<br/><b>State:</b>"+con.State;
}
}
}
在上面的代码中,使用了SqlConnection对象来连接SQL Server数据库。其中,代码里的异常处理程序确保了连接的Close()方法的执行,在这里即使发生了异常,同样可以在finally块中通过执行Close()方法来关闭连接。如果不使用这样的设计结构,当发生了未处理的异常时,连接将一直保持,直到垃圾回收器释放SqlConnection对象。上面的代码运行结果如图6-3所示。
图 6-3 测试连接的示例
除了上面try-catch-finally结构之外,还可以通过使用using来解决这样的问题。通常,可以将数据访问代码放入到using块中。一旦using块语句执行结束,CLR会立刻自动调用对象的Dispose()方法来释放相应的对象,从而可以免去忘记使用Close()方法关闭连接带来的错误。示例如下面的代码所示:
public partial class WebForm1:System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string connectionString=
WebConfigurationManager.ConnectionStrings
["ConnectionString"].ConnectionString;
SqlConnection con=new SqlConnection(connectionString);
using(con)
{
con.Open();
Label1.Text="<b>ServerVersion:</b>"
+con.ServerVersion;
Label1.Text+="<br/><b>State:</b>"+con.State;
}
Label1.Text+="<br/><b>State:</b>"+con.State;
}
}
运行结果与图6-3相同。