Ошибка Syantax в операторе SQL в VBA MS Access - PullRequest
0 голосов
/ 25 октября 2010

Я написал код:

str = "INSERT INTO prod_LJ_Completion VALUES (" _
    & 0 & ", " & PartID & ", " & cmbLJ_TypeID.value & ", " & isChk(chkLJ_Transformator.value) & ", " _
    & isChk(chkLJ_LAD.value) & ", " & txtLJ_KevlarCable.value & ", " & txtLJ_GrayCable.value & ", " _
    & txtLJ_WhiteCable.value & ", " & cmbLJ_CylinderTypeID.value & ", " & isChk(chkLJ_JackPack.value) & ", " _
    & txtJackPackID.value & ", " & isChk(chkLJ_Completed) & ", " & txtLJ_CompletionDate.value & ", " _
    & 0 & ", " & "dbo" & ", " & txtLegLength.value & ", " & txtInsertDiameter.value & ", " & txtPlateKits.value & ", " _
    & isChk(chkPipe_Gal.value) & ", " & isChk(chkDemoModel.value) & ", " & 0 & ", " & 0 & ", " & txtComments.value & ", " & txtAA.value & ")"
CurrentProject.Connection.Execute str

Когда этот код выполняется, я получаю сообщение об ошибке: "Синтаксическая ошибка в инструкции INSERT INTO".

Что не так?

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Похоже, вы не правильно цитируете строковые значения. Например,

& "dbo" &

должно быть

& "'dbo'" &

То же самое необходимо сделать для любых других строковых типов данных.

0 голосов
/ 26 октября 2010

Я думаю, вам трудно отлаживать код из-за этой монстровой строки, которая строит текст SQL на лету.

Вместо того, чтобы динамически создавать SQL во время выполнения, рассмотрите возможность создания процедуры со строго типизированными параметрамив базе данных во время разработки, затем вызывая процедуру со значениями параметров во время выполнения.Добавление списка столбцов к вашему выражению INSERT INTO также может помочь.

Например, когда вы выполняете разовое упражнение, создайте свою процедуру, примерно такую ​​(угадывание имен и типов столбцов):

CREATE PROCEDURE Add_prod_LJ_Completion
(
 :PartID INTEGER, 
 :LJ_TypeID INTEGER, 
 :LJ_Transformator YESNO, 
 :LJ_LAD YESNO, 
 :LJ_KevlarCable VARCHAR(10), 
 :LJ_GrayCable VARCHAR(20), 
 :LJ_WhiteCable VARCHAR(30), 
 :LJ_CylinderTypeID INTEGER, 
 :LJ_JackPack YESNO,  
 :JackPackID INTEGER, 
 :LJ_Completed YESNO,  
 :LJ_CompletionDate DATETIME, 
 :LegLength DECIMAL(11, 3), 
 :InsertDiameter DECIMAL(9, 5), 
 :PlateKits CHAR(5), 
 :Pipe_Gal YESNO,  
 :DemoModel YESNO,  
 :Comments MEMO, 
 :AA CHAR(10)
)
AS
INSERT INTO prod_LJ_Completion 
(
 const_1, PartID, LJ_TypeID, LJ_Transformator, 
 LJ_LAD, LJ_KevlarCable, LJ_GrayCable, 
 LJ_WhiteCable, LJ_CylinderTypeID, 
 LJ_JackPack, JackPackID, LJ_Completed, LJ_CompletionDate, 
 const_2, const_3, LegLength, InsertDiameter, PlateKits, 
 Pipe_Gal, DemoModel, const_4, const_5, Comments, AA

)
VALUES 
(
 0, :PartID, :LJ_TypeID, :LJ_Transformator, 
 :LJ_LAD, :LJ_KevlarCable, :LJ_GrayCable, 
 :LJ_WhiteCable, :LJ_CylinderTypeID, 
 :LJ_JackPack, :JackPackID, :LJ_Completed, :LJ_CompletionDate, 
 0, 'dbo', :LegLength, :InsertDiameter, :PlateKits, 
 :Pipe_Gal, :DemoModel, 0, 0, :Comments, :AA
);

Во время выполнения вы можете использовать объект ADODB Command для выполнения процедуры с параметрами, которые ссылаются на ваши внешние элементы управления, что-то вроде этого:

Sub runitwithparams()

  Dim cmd As ADODB.Command
  Set cmd = New ADODB.Command
  With cmd
    Set .ActiveConnection = CurrentProject.Connection
    .NamedParameters = True
    .CommandType = adCmdStoredProc
    .CommandText = "Add_prod_LJ_Completion"

    .Parameters.Append = _
        .CreateParameter(":PartID", adInteger, adParamInput, , _
            PartID)
    .Parameters.Append = _
        .CreateParameter(":LJ_TypeID", adInteger, adParamInput, , _
            cmbLJ_TypeID.Value)
    .Parameters.Append = _
        .CreateParameter(":LJ_Transformator", adInteger, adParamInput, , _
            isChk(chkLJ_Transformator.Value))
   '// ...
   '// etc etc
   '// ...
    .Parameters.Append = _
        .CreateParameter(":AA", adChar, adParamInput, 10, _
            txtAA.Value)

    Dim rowsAffectedTally As Long
    .Execute rowsAffectedTally

  End With

End Sub

Кроме того, ваша таблица кажется довольно «широкой».Рассмотрим принцип проектирования, согласно которому таблица EITHER моделирует сущность ИЛИ отношения между сущностями, но не обе.Ваша таблица имеет имена столбцов с постфиксом ID, которые указывают на множественные отношения, и имена атрибутов (например, LegLength), которые предлагают сущности.Подумайте о моделировании одного типа сущности для каждой таблицы и отношений в каждой отдельной таблице.

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