ADO.NET 101:SQL 连接
关于连接 SQL 2000 服务器的教程。
关于连接 SQL 数据库
本文旨在作为一篇教程,仅讨论连接到 SQL2000 服务器上的数据库。文章讨论了各种连接选项,并展示了它们的实现细节。数据检索和数据操作将在未来的文章中讨论。只使用了非常简单但基础的代码来测试连接,每个案例都使用不同的 ASPX 页面。本文是独立且完整的,提供 zip 格式的项目副本供下载。
ADO.NET 中的数据库支持
可以从多种数据库检索数据,包括以下内容:
- MS SQL Server 2000 - 企业版
- MSDE - 限制为 2GB
- MS Access - 2000 及其他版本
- 交换
- Windows Active Directory
- Oracle
- MySQL 等。
- 平面文件
ADO.NET 中的提供程序类型
虽然可以检查或操作多种数据库,但基本数据源提供程序如 VS.NET IDE 的“数据”窗口的此屏幕截图所示。
IDE 中基本支持的类型有:
- SQL
- OleDb
- ODBC,以及
- Oracle
其中,只有托管提供程序 SQL 和 OleDb 属于 ADO.NET 方案。ODBC 和 Oracle 等其他类型的 .NET 提供程序可以从其他来源下载。在这些访问数据的方式中,有些比其他方式更好。
如果数据库是 SQL 2000 服务器,SQLData 提供程序是最快的。如果它是一个 SQL 6.5 服务器,.NET 托管提供程序 [SQLData 提供程序] 不适用,因为它不支持 SQL 6.5。ODBCData 提供程序更适合关系数据库,而 OleDb 可以处理许多不同类型的数据,包括关系型和非关系型数据库。显然,如果您使用的是 SQL 2000 服务器数据库,托管 SQL 数据提供程序比 OleDb 数据提供程序快得多。
尽管 ADO.NET [开箱即用] 主要只支持两种托管提供程序,但对于许多数据库来说,OleDb 提供程序非常丰富,如这里所示。
连接场景的注意事项
在进行任何类型的数据访问之前,最重要的一步是连接到数据库。考虑到各种 .NET 提供程序,使用正确且恰当的“连接语言”非常重要,这实际上是正确的“连接字符串”构造。简单地说,连接字符串包含一组由分号分隔的数据库相关信息。该字符串简要描述了数据库所在的服务器、查询的数据库名称,以及是否有正确的身份验证和权限来查看对象,此外还有一些其他详细信息。
还需要考虑其他因素,例如数据库相对于调用应用程序的位置,它是客户端/服务器应用程序还是多层应用程序,是否跨越操作系统和网络边界等。
连接示例
- 使用 Visual Studio IDE 创建到数据库的连接
- 使用工具中的 SQLConnection 控件创建连接
- 创建到服务器的 ODBC 连接
- 创建 OleDb 连接
- 连接到工作组计算机上的数据库
- 使用代码连接到数据库
- 使用存储在配置文件中的连接字符串进行连接
- 使用 SQLConnection 控件的动态属性进行连接
使用 Visual Studio IDE 创建到数据库的连接
使用服务器资源管理器创建连接
连接过程通过一个示例进行解释。创建了一个名为“Connecting”的新 Web 项目,并在删除默认的 aspx 文件后添加了一个名为“SQLConnect.aspx”的 Web 窗体,如下图所示。图中还显示了显示“服务器”和“数据连接”的“服务器资源管理器”。
右键单击“数据连接”节点,选择“添加连接”,如下图所示。
这将打开“数据链接属性”窗口,其中显示了“连接”选项卡中的对象,您可以在其中进行适当的选择,方法是键入、浏览或从下拉列表中进行选择。首先,您从可能拥有的众多服务器中选择一个数据库服务器 [SQL 2000 Server]。在选择之前“刷新”服务器是一个好习惯。在此示例中,将使用本地计算机上的 SQL 2000 服务器。
接下来,您选择登录到此计算机的方法。它可以是“Windows 集成身份验证”,或者需要“用户名”和“密码”才能在 SQL 2000 服务器上进行身份验证。使用 Windows 身份验证通常是更好的选择,因为 Windows 操作系统提供了更高级别的安全功能、审计、监控等。在此示例中,使用了 Windows 身份验证,这会自动“灰色显示”用户名和密码字段。
最后,您从该服务器上的众多数据库中选择一个数据库。此数据库有时称为“初始目录”。在此示例中,选择了“pubs”数据库。在这里,也可以测试您的连接。
当您单击“数据链接属性”的“确定”时,将建立到数据库服务器的连接,如完全限定名称所示:XPHTEK.pubs.dbo [服务器名称、数据库名称和用户标识]。
现在,右键单击您建立的连接并查看其属性。此屏幕截图显示了此连接的属性。
下一个屏幕显示此连接的 ConnectString [与 ConnectionString 不同]。
如果现在展开“连接”节点的节点 [通过单击 + 号],您将看到可用的各种对象,例如表、视图、存储过程等,如下图所示。这里,“表”节点已展开,进一步展开“employee”子节点以显示“列”。
从服务器资源管理器将表拖到 Web 窗体
您可以将表从“服务器资源管理器”拖到 Web 窗体的“设计”视图。这将在 Web 窗体的托盘中添加两个对象 [SQLConnection1
和 SQLDataAdapter1
],如下图所示。
现在,右键单击 SQLConnection1
对象以研究其属性。关于 SQLDataAdapter1
的讨论将在以后的笔记中进行。这将打开 SQLConenction1
对象的属性,如所示;连接类显示为 System.Data.SqlClient.SqlConnection
。
这是生成的“ConnectionString
”属性的副本。这只是我们之前看到的“ConnectString”的一个子集。
SQLConnect.aspx 页面除了这一点连接外,没有其他内容。它在其 Page-Load
事件中只有一个简单的代码,如下图所示,以验证连接确实已建立。
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
SqlConnection1.Open()
If SqlConnection1.State = ConnectionState.Open Then
Label4.Text = "SQL Connection is open"
Else
Label4.Text = "SQL Connection is closed"
End If
End Sub
在此处显示了该页面在 IE 中的外观。
使用工具中的 SQLConnection 控件创建连接
向项目中添加一个名为“SQLConnectionControl.aspx”的 Web 页面。从工具箱中拖动一个 SQLConnection1
数据控件。这将在“设计”视图下方的托盘中添加一个“SQLConnection
”对象。通过右键单击此控件打开此控件的属性。
“属性”窗口显示了各种项目,单击“ConnectionString”项,然后单击“<新建连接...>”。或者,如果您觉得合适的现有连接,也可以选择它。这将打开“数据链接属性”对话框,如之前所示。
出于论证的目的,我们对同一服务器上的同一个数据库进行了又一次连接,但这不是推荐的做法,因为连接是非常宝贵的资源。
SQLConnectionControl.aspx 除了在其 page_Load
事件中的这段短代码外,没有其他内容,用于验证连接是否确实已建立。在此代码中,使用了连接对象的一个属性,称为连接 State
。连接状态值为 1 表示连接已打开,值为 0 表示连接已关闭。
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
SqlConnection1.Open()
Label3.Text = "Server Connection State= " & SqlConnection1.State
End Sub
SQLConnectionControl.aspx 页面在 IE 中呈现如下图所示。
创建到服务器的 ODBC 连接
使用数据库 ODBC 数据源管理员创建 ODBC DSN
ODBC [Open Data Base Connectivity] 过去曾被广泛用于连接到旧版数据库,并且有许多用于此类连接的“提供程序”。在此计算机的 Visual Studio IDE 中,您之前已经看到,除了开箱即用的 SQL 和 OLEDB 类型对象外,还有 ODBC 和 Oracle 数据库对象。
可以通过 Visual Studio IDE 从内部建立 ODBC 连接,类似于前面讨论的 SQLConnection
控件,或者可以使用 Windows 的控制面板界面 [开始 -> 控制面板 -> 管理工具 -> 数据源] 来创建 ODBC 连接,如下图所示。使用此工具,创建了一个名为“ODBCSQL”的新数据源,如下图所示。
此 ODBC 连接的详细信息,它实际上遵循一个“向导”,显示在此处。还建议测试此连接。创建的“文件 DSN”存储为“ODBCSQL.dsn”,将在 Visual Studio IDE 中以此名称引用。
向 Web 页面添加 ODBCConnection 对象
单击 Visual Studio IDE 中的 ODBCConnection
控件并将其拖放到 Web 页面 [名为 ODBCSql.aspx] 上。与 SQLConnection
对象一样,ODBC 连接图标将被添加到托盘中,通过右键单击此图标可以打开其属性窗口,如所示。
现在,如果您单击此属性窗口中的“连接字符串”项,将打开一个“选择数据源”窗口,其中显示“文件数据源”选项卡。在这里,您应该找到您之前创建的“ODBCSQL.dsn”。通过高亮显示并单击“确定”来选择此项,将添加连接字符串所需的必要语言。
ODBC 连接是 ODBCSQL.aspx 页面上唯一的数据库相关项。它在其 Page_load
事件中具有以下代码,用于验证连接是否已建立。
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
OdbcConnection1.Open()
Label3.Text = "Server Connection State=" & OdbcConnection1.State
End Sub
创建 OleDb 连接
创建一个名为 OleDBSQl.aspx 的 Web 页面,并将 OleDBConnection
对象拖到“设计”视图上。这将在“设计”视图下方的托盘中添加一个图标,通过右键单击此图标可以访问其属性。
在“属性”窗口中,单击“ConnectionString”项会打开数据链接属性窗口,您可以在其中进行与设置 SqlConnection
对象连接字符串时所做的选择类似的选择。下一张截图显示了此过程中的连接字符串。此 OleDbConnectionString
与使用前面讨论的“添加连接”例程获得的 ConnectString 之间似乎没有区别。
同样,OleDbSQL.aspx 除了在 Page_load
事件中的一小段代码用于验证连接是否正常工作外,没有其他控件。
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
OleDbConnection1.Open()
Label3.Text = "Server Connection State=" & OleDbConnection1.State
End Sub
在浏览器中打开此页面时显示以下内容。
连接到工作组计算机上的数据库
在这种情况下,工作组涉及一台名为 XPHTEK 的计算机上的 SQL 2000 服务器 [SQL 2000 服务器也名为 XPHTEK],VS.NET 在该服务器上创建了一个托管在 IIS 5.0 服务器上的 Web 应用程序。Web 页面正尝试连接到一台名为 NECHOST 的工作组计算机以访问名为 NECHOST 的 SQL 2000 服务器。NECHOST SQL 服务器已在 XPHTEK 的 SQL 服务器上注册。NECHOST 和 XPHTEK 通过路由器连接。
在 XPHTEK 计算机的本地主机上创建了一个名为 SQLWorkGroup.aspx 的 Web 页面。将一个 SQLConnection
控件拖放到此 Web 窗体的“设计”视图上。如前所述,打开 SQLConnection
属性窗口以配置连接字符串。在数据链接属性窗口中,选择了工作组 SQL 服务器 NECHOST。进行了需要用户名和密码的连接。这显示了数据链接属性页面。
尽管进行了 SQL 服务器身份验证,但连接字符串不包含密码信息。任何尝试连接到服务器的请求都将失败,因为身份验证信息不足。
可以在数据链接属性中选中“允许保存密码”以允许保存密码,但它会以明文形式保存连接字符串,如该选项所示。
在本示例中,SQLConnection1
的属性窗口中的连接字符串已修改为包含密码 [被 xxxxx 隐藏],并包含在此页面的文本中 [不在连接字符串中]。此页面在其 page_load
事件中有一个简短的代码,用于验证连接是否已建立。
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
SqlConnection1.Open()
SqlConnection1.Close()
Label2.Text = "Server Connetion State= " & SqlConnection1.State
End Sub
'Sqlconnection1.State=0 means connection closed.
使用 IE 查看此页面时,渲染效果如下。
使用代码连接到数据库
在项目中添加了一个名为“SQLConnectvb.aspx”的 Web 页面。在表格单元格中插入了一个文本框、一个按钮和一个带有四个标签的表格,并将其文本属性设置为为空。页面应如下图所示。
此页面具有以下代码:
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text = ""
Label2.Text = ""
Try
Dim conStr As New SqlClient.SqlConnection
conStr.ConnectionString = "workstation id=XPHTEK;" & _
"packet size=4096;integrated security=SSPI;data source=XPHTEK;" & _
"persist security info=false;" & "initial catalog= " & TextBox1.Text & _
& ";"
Response.Write("Connection string: " & conStr.ConnectionString)
conStr.Open()
If conStr.State = ConnectionState.Open Then
Label1.Text = "SQLConnection conStr is Open"
conStr.Close()
ElseIf conStr.State = ConnectionState.Closed Then
Label1.Text = "SQLConnection conStr is closed"
End If
Catch sqlxcp As SqlClient.SqlException
Label2.Text = sqlxcp.ToString
Label3.Text = sqlxcp.Message
Label4.Text = sqlxcp.Source
Label5.Text = sqlxcp.Number
Finally
End Try
End Sub
添加了一个 Try
..Catch
..Finally
块来显示如何处理异常。可以连接 SQL 2000 服务器中的任何数据库,因为输入到文本框中的值将传递给连接字符串中的数据库名称。有效的数据库名称是“pubs”、“Northwind”等。任何拼写错误或不存在的数据库都应显示为异常,并且异常的 Number、Message 和 Source 属性的详细信息应显示在表格单元格中。接下来的两个屏幕截图显示了输入有效数据库名称时以及输入无效数据库名称时的页面。
有效的数据库名称
无效的数据库名称
使用存储在配置文件中的连接字符串进行连接
连接字符串信息可以存储在外部持久化文件中,例如配置文件。ASP.NET 为 Web 应用程序提供了 web.config 文件。使用配置文件可以获得一些好处,例如从测试环境迁移到生产环境,此时服务器的名称可能会更改。
在此示例中,连接字符串将存储在 web.config 文件中,Web 页面上的代码将使用此设置连接到数据库。
在项目中添加一个名为 DynConfig 的文件夹。在此文件夹中,添加一个名为 Dynamic.aspx 的 Web 页面。另外,添加一个 web.config 文件 [菜单项 项目->添加新项]。删除默认设置并添加以下 XML 项,如下图所示。它基于存储在配置文件中的 key, value
对。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="books"
value="Server=localhost;integrated security=SSPI;database=Biblio"/>
</appSettings>
</configuration>
向 Dynamic.aspx 页面添加一个文本框以显示连接字符串,一个标签以显示服务器状态,以及一个按钮以启动连接,如下图所示。
此页面 [Dynamic.aspx.vb] 的代码隐藏如下所示。
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim strBook As String
strBook = ConfigurationSettings.AppSettings("books")
Dim dynSQl As New SqlClient.SqlConnection
dynSQl.ConnectionString = strBook
dynSQl.Open()
TextBox1.Text = strBook
If dynSQl.State = 1 Then
Label1.Text = "Server State is Open"
Else
Label1.Text = "Server State is Closed"
End If
dynSQl.Close()
End Sub
End Class
检索“key”,并将其值传递给变量 strBook
。新的 SQLConnection
使用此 ConnectionString
。尽管此示例只有一个“key”,但可以存储并动态调用多个“key”值对。
此页面在 IE 中呈现如下图所示,按钮单击已激活。
使用 SQLConnection 控件的动态属性进行连接
web.config 文件中存储的信息也可以通过将“SQLConnection
”控件从“工具”中放置来使用。在 SQLConnection
控件的“属性”窗口中,您需要在“配置”节点中配置“动态属性”。通过单击该节点的 ConnectionString 项,将弹出一个对话框,询问在配置文件中的“key”和 SQLConnection1.ConnectionString
之间的“映射”指令。这在下一张截图中显示,以及该 SQLConnection
配置所在的“DynamicIDE.aspx”页面上的元素。
此页面只有一个用于连接字符串的文本框,一个用于服务器状态信息的标签,以及一个用于启动活动的按钮。在 IE 中呈现的页面如下图所示。
此页面的代码如下图所示。
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
SqlConnection1.Open()
TextBox1.Text = SqlConnection1.ConnectionString
Label1.Text = "Server State is:" & SqlConnection1.State
End Sub
关于 SQL 连接中的连接池
在多用户内网类型的使用中,当用户尝试访问同一数据库以获取相同数据时,连接池有助于减少创建多个连接的开销。创建池并在不使用时使用休眠连接,可以优化其使用。对于 OLEDB、ODBC 和 OracleDB,连接池由提供程序自动处理。对于 SQL 连接,连接池是隐式管理的。对于具有与现有连接相同连接字符串的新连接,不会创建新池,但对于与现有连接字符串不同的连接,将创建新池。每个唯一的连接字符串都会创建一个连接池,并创建多个连接对象并将其添加到池中,以满足最小池要求。允许更多连接,直到达到最大池大小。可以将 Max pool size、Min Pool size 值添加到连接字符串中。SQL 连接请求首先尝试从池中获取连接 [假设存在一个未使用且休眠的]。如果没有可用的连接,新请求将必须在队列中等待可用连接的释放。当调用 close()
或 dispose()
方法时,连接将被释放。