Запись в таблицу базы данных из формы доступа - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь записать в редактируемую таблицу базы данных из формы доступа, и я получаю синтаксическую ошибку.

В таблице около 30 столбцов, но я хочу, чтобы запись заполнила только 8 из них: (Job #, Job Name, Date, Superintendent, Hauling Vendor, Material,LTC, Loads).

Форма состоит из 8 полей, названных следующим образом:

  • ReportingCOM_Job
  • ReportingBox_JobName
  • ReportingBox_Date
  • ReportingCom_SI
  • ReportingCom_Vendor
  • ReportingCom_Mat
  • ReportingCom_LoadType
  • ReportingBox_Loads

Это комбинация выпадающего списка из запросов, ввода текста и жестко закодированных значений, поэтому простая Открытая форма> Новая запись здесь не будет работать;или я не верю.

Возможно ли это вообще?

Я использую следующую строку и не могу удалить эту ошибку.

CurrentDb.Execute "INSERT INTO MATLog(Job #, Job Name, Date, Superintendent, Hauling Vendor, Material, LTC, Loads) " & _
    " VALUES(" & Me.ReportingCOM_Job & "," & Me.ReportingCom_JobName & ",#" & Me.ReportingBox_Date & "#," & _
    Me.ReportingCom_SI & "," & Me.ReportingCom_Mat & "," & Me.ReportingCom_Vendor & "," & Me.ReportingCom_LoadType & ",#" & Me.ReportingBox_Loads & "#)"

Эта форма должна создать новую запись с этими 8 полями, а остальные оставить пустыми.

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Просто используйте сохраненный запрос и откройте его для запуска. Делая это, вы избегаете необходимости объединять или пунктуировать.

SQL (сохранено ниже как сохраненный запрос, замените myFormName реальным именем формы)

INSERT INTO MATLog([Job #], [Job Name], [Date], [Superintendent], 
                   [Hauling Vendor], [Material], [LTC], [Loads]) 
VALUES(Forms!myFormName!ReportingCOM_Job, Forms!myFormName!ReportingCom_JobName,
       Forms!myFormName!ReportingBox_Date, Forms!myFormName!ReportingCom_SI,
       Forms!myFormName!ReportingCom_Mat, Forms!myFormName!ReportingCom_Vendor, 
       Forms!myFormName!ReportingCom_LoadType, Forms!myFormName!ReportingBox_Loads)

VBA (не нужно закрывать запросы действий, используйте предупреждения, чтобы избежать запросов пользователя)

'DoCmd.SetWarnings False
DoCmd.OpenQuery "mySavedQuery"
'DoCmd.SetWarnings True
1 голос
/ 10 июня 2019

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

INSERT INTO MATLog([Job #], [Job Name] ... )

Вам также нужно будет заключить значения текстовых полей в список VALUES в одинарные или двойные кавычки, например ::

",'" & Me.ReportingCom_JobName & "',

Однако, хотя вышеприведенное должно позволить вашему запросу успешно выполняться, ваш текущий подход к построению оператора SQL с использованием неподтвержденных значений формы, введенных пользователем, уязвим для SQL-инъекции , и вы также столкнетесь с проблемами при вставке текстовых значений, которые сами содержат разделители строк SQL (одинарные / двойные кавычки).

Вместо этого, лучший подход - параметризовать ваш запрос .

Одним из возможных примеров этого может быть следующее:

With CurrentDb.CreateQueryDef("", _
    "insert into matlog ([Job #], [Job Name], [Date], Superintendent, [Hauling Vendor], Material, LTC, Loads) " & _
    "values (p1,p2,p3,p4,p5,p6,p7,p8)")
    .Parameters!p1 = Me.ReportingCOM_Job
    .Parameters!p2 = Me.ReportingBox_JobName
    .Parameters!p3 = Me.ReportingBox_Date
    .Parameters!p4 = Me.ReportingCom_SI
    .Parameters!p5 = Me.ReportingCom_Vendor
    .Parameters!p6 = Me.ReportingCom_Mat
    .Parameters!p7 = Me.ReportingCom_LoadType
    .Parameters!p8 = Me.ReportingBox_Loads
    .Execute
End With
...