Программа не отвечает при запросе к базе данных MS Access 1000000 записей - PullRequest
0 голосов
/ 01 июля 2011

Я пытаюсь найти строку в базе данных MS Access с 1000000 записями, используя VB.Net. Программа не отвечает, если она запущена или занимает очень много времени. Однако, если я уменьшу размер базы данных, программа запустится. Ниже приведен код Может ли кто-нибудь дать мне знать, как мне это сделать .. Заранее спасибо.

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 голосов
/ 01 июля 2011

Если у вас есть 1 000 000 записей, почему вы не используете SQL Server?Сколько трафика получит это приложение?Я не ожидал, что какой-либо сайт будет масштабироваться с MS-Access в качестве хранилища данных.

0 голосов
/ 01 июля 2011

Если вы говорите, что приложение перестает отвечать на запросы после нажатия кнопки, это происходит из-за того, что вы выполняете поиск в своей базе данных Access в том же потоке, который обновляет ваше приложение - это означает, что приложение будет отображаться занятым, пока поиск в базе данных не будет сделано (что может занять некоторое время). Если вы хотите сделать это в фоновом потоке и оставить приложение отзывчивым во время поиска, вы можете сделать это с помощью пула потоков:

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

Кроме того, запрос выполняется лучше с меньшим количеством записей, поскольку в нем меньше данных для поиска, что свидетельствует о том, что он не может быть хорошо проиндексирован. Вы можете добавить индекс в поле «Срок», который поможет ускорить процесс - вам нужно посмотреть, помогло ли это. Access должен будет выполнить сканирование индекса, а не более быстрый поиск индекса, поэтому ответ не будет мгновенным, но это может помочь значительно сократить время ожидания. Вот статья Microsoft, которая показывает, как это сделать:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...