Sql 如何在Access VB中使用插入选择查询?

Sql 如何在Access VB中使用插入选择查询?,sql,ms-access,vba,ms-access-2013,Sql,Ms Access,Vba,Ms Access 2013,我有一个名为Student的表,其中包含有关学生的信息,例如他们的姓名。另一个名为“考试”的表有考试日期和学生姓名作为主键。我有一个表格,可以用来从列表框中选择多个学生,然后在选择的日期将其插入到考试表中 我相信我的语法是正确的,因为如果我使用Access的查询生成器,复制/粘贴我的SQL查询,并去掉表单内容,它将按预期工作。当我尝试从VB运行它时,遇到的错误是Exam.Exam\u日期未知,无法检查我的拼写。我把它拼得和表上的一模一样 在Access中的VB中不能使用插入选择查询吗 这是我的密

我有一个名为Student的表,其中包含有关学生的信息,例如他们的姓名。另一个名为“考试”的表有考试日期和学生姓名作为主键。我有一个表格,可以用来从列表框中选择多个学生,然后在选择的日期将其插入到考试表中

我相信我的语法是正确的,因为如果我使用Access的查询生成器,复制/粘贴我的SQL查询,并去掉表单内容,它将按预期工作。当我尝试从VB运行它时,遇到的错误是Exam.Exam\u日期未知,无法检查我的拼写。我把它拼得和表上的一模一样

在Access中的VB中不能使用插入选择查询吗

这是我的密码:

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

结束Sub

我知道您可能已经发现了您的问题,但我确实想指出一些其他事项

构建WHERE IN子句是一个非常有趣的设置。或者,您可以迭代插入到。。。For/Next循环中的值:

INSERT INTO Exam (Exam_date, Student_Name) 
VALUES(#" & Me.ExamDate & "#, '" & Me.StudentListBox.ItemData(i) & "') 
同时检查您的考试日期字段。从您的查询来看,似乎将日期保留为字符串字段,但如果是日期/时间字段,VBA查询需要的是单引号,而不是单引号。如果表单已经格式化为这些日期类型,也不需要转换函数CStr或CDate


最后,对于数据库设计建议,您应该在考试表中使用StudentID,而不是通过全名关联两个表:更好的索引、主键/外键引用完整性、数据存储效率。另外,如果名称中有引号,则不需要转义或拼写错误,而整数值在管理表间数据时更安全,即重复、查找。

我认为这不重要,但请尝试将插入更改为插入到考试日期中,学生名称选择。Access可以使用insert…select语句。谢谢jpw!我不太明白为什么,但你的建议奏效了!