[英]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.