我有一个名为Student的表,其中包含学生的信息,例如他们的名字。 Anther表名为Exam,其中包含考试日期和学生姓名作为主键。我有一个表单,可用于从列表框中选择多个学生,然后将在所选日期插入考试表。
我相信我的语法是正确的,因为如果我使用Access的查询构建器并复制/粘贴我的SQL查询并删除表单内容它将按预期工作。我尝试从VB运行它时得到的错误是Exam.Exam_Date未知并检查我的拼写。我正在拼写它在表格中的拼写方式。
是否无法在Access中使用INSERT INTO SELECT查询?
这是我的代码:
Private Sub add_Click()
Dim Students As String
Dim i As Integer
Dim dbs As DAO.Database
Dim SQL As String
SQL = ""
Students = "'"
For i = 0 To Me.StudentListBox.ListCount - 1
'check to see if students name is selected
If Me.StudentListBox.Selected(i) = True Then
'list student names in a string separated by commas
Students = Students + CStr(Me.StudentListBox.ItemData(i)) & "','"
End If
Next
If IsNull(Me.ExamDate) Then 'check if user entered an Exam date
MsgBox "Please select a date for the Exam."
ElseIf Students = "'" Then 'check if user selected ant Students
MsgBox "Please select Students to add to an Exam."
Else
'remove trailing comma
Students = Left(Students, Len(Students) - 2)
'sql query to add list of Students to an Exam on specified date
SQL = "INSERT INTO Exam (Exam.Exam_Date, Exam.Student_Name) SELECT '" & CDate(Me.ExamDate) & "', Students.Full_Name FROM Students WHERE Students.Full_Name IN (" & Students & ");"
DoCmd.RunSQL SQL
End If
End Sub
答案 0 :(得分:1)
我知道您可能已经找到了您的问题,但我确实想指出其他一些项目。
构建WHERE IN子句是一个非常有趣的设置。或者,您可以在For / Next循环中迭代INSERT INTO ... VALUES:
INSERT INTO Exam (Exam_date, Student_Name)
VALUES(#" & Me.ExamDate & "#, '" & Me.StudentListBox.ItemData(i) & "')
同时检查您的Exam_Date字段。从您的查询看起来您将日期保留为字符串字段,但如果日期/时间字段,VBA查询需要##而不是单引号。如果已经通过表单格式化为这些日期类型,也不需要转换函数CStr或CDate。
最后,对于数据库设计建议,您应该在Exam表中使用StudentID,而不是通过Full_Name关联两个表:更好的索引,主/外键参照完整性,数据存储效率。另外,如果名称有引号,则不需要转义或拼写错误,整数值更安全地管理表之间的数据(即重复,查找)。