五分鐘知道ADO.NET異步查詢
ADO.NET經(jīng)過(guò)長(zhǎng)時(shí)間的發(fā)展,很多用戶都很了解ADO.NET了,這里我發(fā)表一下個(gè)人理解,和大家討論討論。ADO.NET數(shù)據(jù)庫(kù)提供程序包含Connection、Command、DataAdapter和DataReader對(duì)象。在一般的ADO.NET編程中,首先要?jiǎng)?chuàng)建Connection對(duì)象,給它提供需要的信息,例如連接字符串。然后創(chuàng)建一個(gè)Command對(duì)象,給它提供要執(zhí)行的SQL命令的細(xì)節(jié)。這個(gè)命令可以是內(nèi)置的SQL文本命令、存儲(chǔ)過(guò)程或?qū)Ρ淼闹苯釉L問(wèn)。如果需要,還可以為這些命令提供參數(shù)。
#T#在創(chuàng)建Connection和Command對(duì)象后,就必須確定命令是否返回結(jié)果集。如果命令不返回結(jié)果集,就可以通過(guò)調(diào)用幾個(gè)Execute方法之一,執(zhí)行命令。另一方面,如果命令返回結(jié)果集,就必須確定是否要保留結(jié)果集,以備將來(lái)在不維持與數(shù)據(jù)庫(kù)的連接的情況下使用。如果要保留結(jié)果集,就必須創(chuàng)建一個(gè)DataAdapter對(duì)象,用它填充DataSet或DataTable對(duì)象。這些對(duì)象可以在斷開(kāi)連接的模式下維護(hù)其中的信息。但是,如果不想保留結(jié)果集,只是要以快速方式執(zhí)行命令,就可以使用Command對(duì)象創(chuàng)建DataReader對(duì)象。DataReader對(duì)象需要與數(shù)據(jù)庫(kù)的實(shí)時(shí)連接,它是一個(gè)只向前的只讀光標(biāo)。下面我們來(lái)看一個(gè)關(guān)于使用ADO.NET異步查詢的案例。
使用ADO.NET異步查詢,并將查詢結(jié)果呈現(xiàn)在指定的Form的DataGridView中
- Public Class Asynchronous
- Private Delegate Sub MainInvoke(ByVal TableItems() As String, ByVal RowCount As Integer) '委托
- Delegate Sub AsyncMethodCaller()
- Public connstr As String
- Public cmdstr As String
- Public frm As Form ' 指定的form
- Public dgv As DataGridView ' 指定的datagridview
- Public statuscontrol As Control ' 顯示狀態(tài)的控件
- Public message As String'狀態(tài)提示文本
- Private Sub CallbackHandler()
- Using conn As New SqlConnection(connstr), cmd As New SqlCommand(cmdstr, conn)
- conn.Open()
- Using reader As SqlDataReader = cmd.ExecuteReader
- Dim i As Integer
- Dim items(dgv.Columns.Count - 1) As String
- While reader.Read()
- For j As Int32 = 0 To dgv.Columns.Count - 1
- items(j) = reader(dgv.Columns(j).HeaderText)
- Next
- frm.Invoke(New MainInvoke(AddressOf Addrows), items, i)
- i += 1
- End While
- End Using
- conn.Close()
- End Using
- End Sub
- Public Sub getdatabase()
- Dim caller As New AsyncMethodCaller(AddressOf CallbackHandler)
- Dim result As IAsyncResult = caller.BeginInvoke(AddressOf StopRead, caller)
- End Sub
- Private Sub Addrows(ByVal TableItems() As String, ByVal row As Integer) '添加新行,并顯示處理進(jìn)度
- dgv.Rows.Add()
- For i As Int32 = 0 To TableItems.Length - 1
- dgv.Rows(row).Cells(i).Value = TableItems(i)
- Next
- If statuscontrol IsNot Nothing Then statuscontrol.Text = message & row
- End Sub
- Private Sub StopRead(ByVal ar As IAsyncResult)
- Dim caller As AsyncMethodCaller = CType(ar.AsyncState, AsyncMethodCaller)
- caller.EndInvoke(ar)
- End Sub
- End Class
ADO.NET異步查詢使用方法:
- DataG.Columns.Add("編號(hào)", "編號(hào)")
- DataG.Columns.Add("時(shí)間", "時(shí)間")
- DataG.Columns.Add("用戶名", "用戶名")
- Dim newselect As New Asynchronous
- newselect.connstr = "SERVER=x;DATABASE=x;USER=x;PASSWORD=x;Asynchronous Processing=true"
- newselect.cmdstr = "select * from log"
- newselect.frm = Me
- newselect.dgv = DataG
- newselect.statuscontrol = Me
- newselect.message = "數(shù)據(jù)檢索中..."
- newselect.getdatabase()