Существуют ли проблемы с таблицами, использующими автонумерацию в качестве первичного ключа в базе данных ms access db? - PullRequest
0 голосов
/ 05 января 2011

Я унаследовал базу данных MS Access в моем офисе, которая активно используется несколькими людьми по сети.Это вызывает много проблем с коллизиями и блокировками данных.Я хочу разделить базу данных таким образом, чтобы у каждого пользователя было свое собственное интерфейсное приложение, и он должен хранить основные данные на сервере.

В нескольких таблицах используется autonumber: sequence: пока их первичный ключ - при исследовании того, как выполнить разбиение, я наткнулся на несколько сообщений, которые намекают, что это может вызвать проблемы при распределении базы данных, но у меня нет 'не смог найти ничего солидного.Похоже, проблема заключается в том, что пользователь может начать новую запись и получить следующий автонуммер, но второй пользователь может создать новую запись в течение короткого интервала и получить тот же автонуммер, что приведет к ошибке?

Обрабатывает ли Jetэто правильно или есть проблемы с автонумерацией в базе данных FE / BE?Если это маловероятное, но возможное событие, я уверен, что оно все равно будет намного лучше, чем то, что испытывают мои пользователи, но я хотел бы знать, есть ли способы, которыми я могу минимизировать такие проблемы.

Спасибоза вашу помощь!

Ответы [ 4 ]

2 голосов
/ 05 января 2011

Я имел несчастье работать со многими базами данных Access в моей юности. Хотя есть много проблем с Access, я не знаю, сталкивался ли я когда-либо с колонками AutoNumber в многопользовательской среде с разделенной базой данных. Это должно работать нормально. Это настолько распространенная установка, что по всему Интернету будут сообщения об этом, если возникнет проблема.

0 голосов
/ 27 октября 2015

У меня была такая же проблема, тем не менее я сделал обходной путь, чтобы получить работу по нумерации из Onload () Событие

Что я сделал:

  1. Я создаю набор записей на основе Your_Table каждый раз, когда пользователю нужен автоматический номер
  2. Открыть набор записей (первый)
  3. Поиск, если:
    -Your_Table пуст, затем присваивает значение "1" для Your_field
    -Your_Table имеет данные без пропущенных чисел, затем присваивает значение = "Количество строк + 1" для Your_field (1,2, ....,n + 1)
    -Your_Table содержит недостающие данные (1,3,4,5,7) [Примечание: «№2 и №7 отсутствуют]», , а затем использует функцию для поиска в Your_Tableпропущенные поля и присвойте Your_Field первое пропущенное значение (# 2 в этом примере)


Private Sub Autonumbering(Your_Table As String)
Dim rst As DAO.Recordset
Dim db As Database

On Error GoTo ErrorHandler

Application.Echo False

Set db = CurrentDb
Set rst = db.OpenRecordset(Your_Table, dbOpenDynaset)

                    With rst
                        .AddNew
                            'Your_Table is Empty, **then** assigns the value "1" to Your_field
                            If DMin("[Your_Field]", Your_Table) = 1 Then
                                'Your_Table is has data without missing numbers,**then** assigns the value = "Count of lines + 1" to Your_field (1,2,....,n+1)
                                If DMax("[Your_Field]", Your_Table) = .RecordCount Then
                                    'Assings n+1 value to [Your_Field] records
                                    Value = .RecordCount + 1
                                        ![Your_Field] = Valor
                                Else
                                    'Your_Table has missing data (1,3,4,5,7) [Note "#2 and #7 are missing]", **then** uses a function to search in Your_Table & _
                     the missing fields and assign to Your_Field the first missing value (#2 in this example)
                                    Value = MyFunction$(Your_Table, "Your_Field")
                                        ![Your_Field] = Value
                                End If
                            Else
                            'Agrega el número 1
                            Value = 1
                            ![Your_Field] = Value
                            End If
                        .Update
                        .Bookmark = .LastModified
                        Me.Requery
                        DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, Value
                        .Move 0, .LastModified
                    End With
ErrorCorregido:
Application.Echo True
Exit Sub

ErrorHandler:
MsgBox "An error ocurred, please verify numbering", vbCritical + vbOKOnly
Resume ErrorCorregido

End Sub


ВотФункция, которую я нашел, чтобы получить пропущенные значения в определенной таблице, я больше не могу ее найти, но спасибо за того, кто это сделал.


Function MyFunction$(cstrTable As String, cstrField As String)

' Read table/query sequentially to record all missing IDs.
' Fill a ListBox to display to found IDs.
' A reference to Microsoft DAO must be present.

  Dim dbs     As DAO.Database
  Dim rst     As DAO.Recordset
  Dim lst     As ListBox
  Dim Col     As Collection

  Dim strSQL  As String
  Dim strList As String
  Dim lngLast As Long
  Dim lngNext As Long
  Dim lngMiss As Long

  ' Build SQL string which sorts the ID field.
  strSQL = "Select " & cstrField & "" _
   & " From " & cstrTable & " Order By 1;"

  Set Col = Nothing
  ' Control to fill with missing numbers.
  'Set lst = Me!lstMissing

  ' Collection to hold the missing IDs.
  Set Col = New Collection

  '// Vacía la colección
  'Erase Col
    ' Read the table.
  Set dbs = CurrentDb
  Set rst = dbs.OpenRecordset(strSQL)

  If rst.RecordCount = 0 Then
    ' The recordset is empty.
    ' Nothing to do.
  Else
    ' Read and save the ID of the first record.
    lngLast = rst(cstrField).value
    rst.MoveNext
    ' Loop from the second record through the recordset
    ' while reading each ID.
    While rst.EOF = False
      lngNext = rst(cstrField).value
      ' For each ID, fill the collection with the
      ' missing IDs between the last ID and this ID.
      For lngMiss = lngLast + 1 To lngNext - 1
        Col.Add (lngMiss)
      Next
      ' Save the last read ID and move on.
      lngLast = lngNext
      rst.MoveNext
    Wend
    ' Finally, add the next possible ID to use.
    Col.Add (lngLast + 1)
  End If
  rst.Close

  For lngMiss = 1 To Col.Count
    ' Build the value list for the ListBox.
    If Len(strList) > 0 Then
      ' Append separator.
      strList = strList & ";"
    End If
    ' Append next item from the collection.
    strList = strList & Col(lngMiss)
    ' For debugging only. May be removed.
    Debug.Print Col(lngMiss)
  Next
  ' Pass the value list to the ListBox.
  ' Doing so will requery it too.
  ' lst.RowSource = strList
  ' For debugging only. May be removed.
  ' Debug.Print strList
  MyFunction$ = Col(1)
  ' Clean up.
  Set rst = Nothing
  Set dbs = Nothing
  Set Col = Nothing
  Set lst = Nothing

End Function
0 голосов
/ 08 января 2011

Кажется, с вашей стороны есть некоторая путаница в процессе расщепления. Когда вы делаете это, вы получаете несколько внешних интерфейсов, но сервер остается одним файлом. Таким образом, для таблиц данных с точки зрения Autonumbers нет никаких отличий от того, что было до разделения приложения.

0 голосов
/ 06 января 2011

Пока вы не собираетесь выполнять репликацию данных (т.е. базы данных с несколькими подписчиками, где пользователи могут вставлять новые записи в те же таблицы, но в разные места), у вас не будет проблем с автономными номерами в качестве первичных ключей.* Если вы считаете, что на днях вам может понадобиться репликация (разные местоположения, одна центральная база данных), не стесняйтесь переключаться на уникальные идентификаторы (идентификаторы репликации).

...