查询1000000记录的MS Access数据库时程序没有响应

时间:2011-06-30 22:07:45

标签: vb.net ms-access-2007

我正在尝试使用VB.Net在MS Access数据库中搜索包含1000000条记录的字符串。该程序一旦运行或者需要很长时间才会响应。但是,如果我减少程序运行的数据库的大小。 以下是代码任何人都可以告诉我如何解决它...提前致谢。

Imports System.Data.SqlClient

Public Class Form1

    Dim rcount As Integer
    Dim conn As New ADODB.Connection
    Dim rcset As New ADODB.Recordset
    Dim sqlStr As String

    Public Sub openConn()
        Dim strConnect As String
        strConnect = "DRIVER={Microsoft Access Driver (*.mdb)}; DefaultDir=" & Application.StartupPath & ";DBQ=atg;UID=;PWD=;"
        If conn.State = 0 Then
            conn.ConnectionString = strConnect
            conn.Open()
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub

    Public Sub rcdSet(ByVal sqlStr As String)
        If conn.State = 0 Then
            Call openConn()
        End If
        If rcset.State = 1 Then
            rcset.Close()
            rcset = Nothing
            rcset = New ADODB.Recordset
            rcset.CursorLocation = ADODB.CursorLocationEnum.adUseServer
            rcset.CursorType = ADODB.CursorTypeEnum.adOpenDynamic
            rcset.LockType = ADODB.LockTypeEnum.adLockOptimistic
        End If
        rcset.Open(sqlStr, conn)
    End Sub

    Private Sub btn_search_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_search.Click
        Dim sql As String
        Dim rs As New ADODB.Recordset
        Dim rs2 As New ADODB.Recordset
        Dim res As String
        res = ""
        Call openConn()
        Dim SearchString_exist As New List(Of String)(txt_exist.Text.Split(Environment.NewLine))
        '  Dim SearchString_not_exist As New List(Of String)(txt_not_exist.Text.Split(Environment.NewLine))
        '  Do Until SearchString_exist.Count = 0
        sql = "SELECT * FROM ATG WHERE Term like '%cam%'"
        rs.Open(sql, conn, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic)
        While (rs.EOF <> True)
            res += rs.Fields("Term").Value + Environment.NewLine
            rs.MoveNext()
        End While
        rs.Close()
        SearchString_exist.RemoveAt(0)
        txt_exist.Lines = SearchString_exist.ToArray
        'Loop
        txt_result.Text = res
    End Sub
End Class

2 个答案:

答案 0 :(得分:0)

如果您说单击按钮后应用程序没有响应,那是因为您在更新应用程序的同一个线程上搜索Access数据库 - 这意味着应用程序将显示为忙,直到您的数据库搜索为止完成(可能需要一段时间)。如果你想在后台线程中执行此操作并在搜索期间保持应用程序响应,可以使用线程池执行此操作:

http://www.dotnetperls.com/threadpool-vbnet

此外,查询运行得更少,记录更少,因为它搜索的数据较少,这表明它可能没有很好地编入索引。你可以在“Term”字段上添加一个索引,这将有助于加快速度 - 你必须看看它是否有帮助。访问必须进行索引扫描,而不是更快的索引搜索,因此响应不会立即响应,但它可能有助于显着缩短您的等待时间。这是一篇Microsoft文章,展示了如何执行此操作:

http://office.microsoft.com/en-us/access-help/create-and-use-an-index-to-improve-performance-HA010210347.aspx

答案 1 :(得分:0)

如果您有1,000,000条记录,为什么不使用SQL Server?这个应用程序将获得多少流量?我不希望任何网站使用MS-Access作为其数据存储来扩展。