如何在Access VB中使用INSERT INTO SELECT查询?

时间:2015-02-06 19:00:10

标签: sql ms-access access-vba ms-access-2013

我有一个名为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

1 个答案:

答案 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关联两个表:更好的索引,主/外键参照完整性,数据存储效率。另外,如果名称有引号,则不需要转义或拼写错误,整数值更安全地管理表之间的数据(即重复,查找)。