12.5多数据结果集
来源:优易学  2010-1-12 11:55:58   【优易学:中国教育考试门户网】   资料下载   IT书店

在之前版本的 SQL Server 同一时间一条连接只能传递一个 SELECT 语法执行后返回的结果集。SQL Server 2005 提供了在同一条连接上可以同时传递多个没有游标结构(cursorless)的结果集(也称为默认结果集),此功能称为 Multiple Active Resultsets(MARS)。如此可以节省需要同时打开的连接数,但要注意的是连接字符串设置要加上 MultipleAct- iveResultSets=true 属性,否则默认不启动多数据结果集的功能。我们示范这项功能所设计的范例程序画面如图12-7 所示:

在范例中我们用一条连接同时查询每一笔订单与订单细节,并将订单数据存放到 ListBox 控制项,而每一笔订单的细节数据则存放到 Hashtable 类型的实例中。当用户点选 ListBox 不同的项目时,通过键值从 Hashtable 中取出订单细节数据。范例程序代码如列表12-7:

图12-7 通过 SQL Server 2005 所提供的 MARS 机制,同时返回订单与订单细节数据记录

程序代码列表12-7 在同一个 SqlConnection 中实例同时访问多个结果集

Dim conn As SqlConnection

‘利用 Hashtable 存放所有查询回来的订单细节数据

Dim has As New Hashtable

Private Sub marsForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) _

Handles Me.Load

'要设置 MultipleActiveResultSets=true,默认为 False,会导致同一条连接同时

'打开第二个 DataReader 实例时发生异常

conn = New SqlConnection(ADONET20.My.Settings.AdventureWorksConnection & _

";MultipleActiveResultSets=true")

End Sub

Private Sub listOrdersButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles listOrdersButton.Click

'如果连接尚未打开的话,打开连接,

'并用来同时取得订单的开始与细节

If conn.State <> ConnectionState.Open Then conn.Open()

has.Clear()

orderListBox.Items.Clear()

Dim orderReader As SqlDataReader

Dim getOrders As New SqlCommand( _

"SELECT SalesOrderID,OrderDate,Status FROM Sales.SalesOrderHeader " & _

"WHERE SalesOrderID BETWEEN " & txtStart.Text & " AND " & txtEnd.Text, conn)

orderReader = getOrders.ExecuteReader()

While orderReader.Read()

orderListBox.Items.Add(orderReader("SalesOrderID") & _

" - " & orderReader("OrderDate") & " - " & orderReader("Status"))

GetDetail(orderReader("SalesOrderID"))

End While

If orderListBox.Items.Count = 0 Then

MessageBox.Show("没有符合范围的订单编号")

Exit Sub

End If

'选取第一张订单并显示其内所采购的产品

orderListBox.SelectedIndex = 0

conn.Close()

End Sub

Private Sub GetDetail(ByVal OrderID As String)

Dim ds As New DataSet

'同一条连接同时执行 SQL 语法并取回结果

'以往若前一个 DataReader 未关,则不可以同时取得其他的 DataReader

Dim adp As New SqlDataAdapter( _

"SELECT ProductID,OrderQty,UnitPrice,LineTotal FROM Sales.SalesOrderDetail " & _

"WHERE SalesOrderID = " & OrderID, conn)

adp.Fill(ds)

has.Add(OrderID, ds.Tables(0))

End Sub

在上述范例中,最大的特色是在一条数据库连接内同时访问订单数据与对应的细节记录。以往若一条连接的结果集没有关闭时,是无法再打开另一个结果集的,所以上述程序代码若在以往必须同时打开两条连接才能完成订单与订单细节的数据访问。

责任编辑:cyth

文章搜索:
 相关文章
热点资讯
热门课程培训