Обновление OleDbConnection к базе данных Access - лучшая практика - PullRequest
0 голосов
/ 12 декабря 2011

По причинам, которые слишком длинны для объяснения в моем приложении .Net Win-Form, я использую одну глобальную OleDbConnection для подключения БД доступа.Когда мне нужно, я открываю и закрываю соединение, но обычно соединение остается открытым.Проблема в том, что иногда чтение данных не возвращает обновленные данные:

Using cm As New OleDb.OleDbCommand(sQuery, cn)
    Using rd As OleDb.OleDbDataReader = cm.ExecuteReader()
        If rd.HasRows Then
            If rd.Read() Then
                Me.txtBrand.Text = rd.Item("MA_BRAND")
            End If
        End If
        rd.Close()
    End Using
End Using

В то время как при использовании нового соединения я получаю правильные данные:

Using cn As New OleDb.OleDbConnection(sConnectionString)
    cn.Open()
    Using cm As New OleDb.OleDbCommand(sQuery, cn)
        Using rd As OleDb.OleDbDataReader = cm.ExecuteReader()
            If rd.HasRows Then
                If rd.Read() Then
                    Me.txtBrand.Text = rd.Item("MA_BRAND")
                End If
            End If
            rd.Close()
        End Using
    End Using
    cn.Close()
End Using

Мне нужноиспользуйте глобальное соединение, тогда мое решение это

cn.Close()
cn.Open()
Using cm As New OleDb.OleDbCommand(sQuery, cn)

Но я спрашиваю: есть ли лучшее решение для обновления OledbConnection?

Спасибо!Pileggi

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

Механизм Jet Access кеширует данные - возможно, это проблема.

Вот хорошая ссылка:

1 голос
/ 12 декабря 2011

Нет, не оставляйте соединение открытым.Пул соединений обеспечивает быстрое повторное соединение.

Проблема, с которой вы сталкиваетесь при чтении и записи данных, связана с тем, как реализовано Jet :

Microsoft Jetимеет кэш чтения, который обновляется каждые миллисекунды PageTimeout (по умолчанию 5000 мс = 5 секунд).Он также имеет механизм отложенной записи, который работает в отдельном потоке для основной обработки и, таким образом, записывает изменения на диск асинхронно.

Кроме того, rd.HasRows() не требуется, If rd.Read() Then будетвернуть false, если строк нет.

Для продолжения rd.Close() также не требуется, так как вы используете объявление Using...End Using.End Using закроет и избавится от него для вас.

...