3146 Ошибка вызова ODBC — Access 2010

Пожалуйста, укажите код ниже...

Private Sub Save_Click()
  On Error GoTo err_I9_menu
  Dim dba As Database
  Dim dba2 As Database
  Dim rst As Recordset
  Dim rst1 As Recordset
  Dim rst2 As Recordset
  Dim rst3 As Recordset
  Dim SQL As String
  Dim dateandtime As String
  Dim FileSuffix As String
  Dim folder As String
  Dim strpathname As String
  Dim X As Integer

  X = InStrRev(Me!ListContents, "\")

  Call myprocess(True)

  folder = DLookup("[Folder]", "Locaton", "[LOC_ID] = '" & Forms!frmUtility![Site].Value & "'")
  strpathname = "\\Reman\PlantReports\" & folder & "\HR\Paperless\"
  dateandtime = getdatetime()

  If Nz(ListContents, "") <> "" Then
    Set dba = CurrentDb

    FileSuffix = Mid(Me!ListContents, InStrRev(Me!ListContents, "."), 4)

    SQL = "SELECT Extension FROM tbl_Forms WHERE Type = 'I-9'"
    SQL = SQL & " AND Action = 'Submit'"

    Set rst1 = dba.OpenRecordset(SQL, dbOpenDynaset, dbSeeChanges)

    If Not rst1.EOF Then
      newname = Me!DivisionNumber & "-" & Right(Me!SSN, 4) & "-" & LastName & dateandtime & rst1.Fields("Extension") & FileSuffix
    Else
      newname = Me!DivisionNumber & "-" & Right(Me!SSN, 4) & "-" & LastName & dateandtime & FileSuffix
    End If

    Set moveit = CreateObject("Scripting.FileSystemObject")

    copyto = strpathname & newname
    moveit.MoveFile Me.ListContents, copyto

    Set rst = Nothing
    Set dba = Nothing

  End If

  If Nz(ListContentsHQ, "") <> "" Then
    Set dba2 = CurrentDb

    FileSuffix = Mid(Me.ListContentsHQ, InStrRev(Me.ListContentsHQ, "."), 4)

    SQL = "SELECT Extension FROM tbl_Forms WHERE Type = 'HealthQuestionnaire'"
    SQL = SQL & " AND Action = 'Submit'"

    Set rst3 = dba2.OpenRecordset(SQL, dbOpenDynaset, dbSeeChanges)

    If Not rst3.EOF Then
      newname = Me!DivisionNumber & "-" & Right(Me!SSN, 4) & "-" & LastName & dateandtime & rst3.Fields("Extension") & FileSuffix
    Else
      newname = Me!DivisionNumber & "-" & Right(Me!SSN, 4) & "-" & LastName & dateandtime & FileSuffix
    End If

    Set moveit = CreateObject("Scripting.FileSystemObject")

    copyto = strpathname & newname
    moveit.MoveFile Me.ListContentsHQ, copyto

    Set rst2 = Nothing
    Set dba2 = Nothing

  End If

  Set dba = CurrentDb

  Set rst = dba.OpenRecordset("dbo_tbl_EmploymentLog", dbOpenDynaset, dbSeeChanges)

  rst.AddNew
  rst.Fields("TransactionDate") = Date
  rst.Fields("EmployeeName") = Me.LastName
  rst.Fields("EmployeeSSN") = Me.SSN
  rst.Fields("EmployeeDOB") = Me.EmployeeDOB
  rst.Fields("I9Pathname") = strpathname
  rst.Fields("I9FileSent") = newname
  rst.Fields("Site") = DLookup("Folder", "Locaton", "Loc_ID='" & Forms!frmUtility!Site & "'")
  rst.Fields("UserID") = Forms!frmUtility!user_id
  rst.Fields("HqPathname") = strpathname
  rst.Fields("HqFileSent") = newname2
  rst.Update

  Set dba = Nothing
  Set rst = Nothing

exit_I9_menu:
  Call myprocess(False)
  DivisionNumber = ""
  LastName = ""
  SSN = ""
  ListContents = ""
  ListContentsHQ = ""
  Exit Sub

err_I9_menu:
  Call myprocess(False)
  MsgBox Err.Number & " " & Err.Description
  'MsgBox "The program has encountered an error and the data was NOT saved."
  Exit Sub

End Sub

Я продолжаю получать сообщение об ошибке вызова ODBC. Все разрешения правильные, и предыдущий фрагмент кода работал там, где были отдельные таблицы для журналов I9 и Hq. Подпрограмма вызывается, когда кто-то отправляет набор файлов с определенной информацией.


person designspeaks    schedule 06.10.2014    source источник
comment
Это много кода, который вы опубликовали. На какой линии не работает? rst.Update?   -  person mwolfe02    schedule 07.10.2014


Ответы (3)


Просто предположение, но я думаю, что у вас есть опечатка, которая приводит к назначению Null обязательному полю.

Изменить «Местоположение»:

rst.Fields("Site") = DLookup("Folder", "Locaton", "Loc_ID='" & Forms!frmUtility!Site & "'")

В «Местоположение»:

rst.Fields("Site") = DLookup("Folder", "Location", "Loc_ID='" & Forms!frmUtility!Site & "'")

Несколько общих советов по устранению ошибок 3146 ODBC: DAO имеет коллекцию ошибок, которая обычно содержит более конкретную информацию об ошибках ODBC. Ниже приведен быстрый и грязный способ увидеть, что там внутри. У меня есть более совершенная версия этого в стандартном модуле обработки ошибок, который я включаю во все свои программы:

Dim i As Long
For i = 0 To Errors.Count - 1
    Debug.Print Errors(i).Number, Errors(i).Description
Next i
person mwolfe02    schedule 06.10.2014
comment
Спасибо за ответ. На самом деле Locaton правильное имя таблицы. С тех пор я решил проблему. Каждая запись содержит уникальный идентификатор, и он не хотел создавать идентификатор. - person designspeaks; 07.10.2014
comment
Пожалуйста, найдите время, чтобы опубликовать шаги, которые вы предприняли для решения проблемы, и примите свой ответ, чтобы он мог помочь другим в будущем. - person mwolfe02; 07.10.2014
comment
@ mwolfe02 Ваши быстрые и грязные 4 строки кода только что помогли мне решить мою ошибку 3146. Спасибо! - person PKatona; 14.04.2017

Я решил это, воссоздав таблицу в SQL, а не увеличивая ее размер из Access.

person designspeaks    schedule 25.11.2014

Моя ошибка 3146 была вызвана отсутствием первичного ключа в моей таблице сервера sql. Проблема была решена путем определения первичного ключа и последующего обновления соединения с помощью диспетчера связанных таблиц.

person Allie H    schedule 01.05.2018