簡體   English   中英

MS Access VBA中的SQL語句中的Syantax錯誤

[英]Syantax error in SQL statement in VBA of MS Access

我寫了代碼:

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語句中的語法錯誤”。

怎么了?

看來您沒有正確引用字符串值。 例如,

& "dbo" &

應該

& "'dbo'" &

對於任何其他字符串數據類型,都需要執行相同的操作。

我認為您發現您的代碼難以調試,因為那條怪異的行動態生成了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)。 考慮為每個表建模一種實體類型,並在單獨的表中建模每種實體的關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM