使用VBA在Access中创建GUI(我第一次在本学期看到它,对我来说看起来很不寻常)。我得到了表Authors
,其中列author_id
,last_name
,first_name
和表Books
列author_id
,book_name
。
我在表单上有一个按钮,点击它应该要求用户输入作者的姓氏,然后搜索并显示该作者的所有书籍。
因此,我尝试从Authors表中查找作者ID,然后从Books表中显示author.author_id等于books.author_id的所有书籍。
我在想我需要创建包含author_id值的临时查询,之后使用像"SELECT [Books].[book_name] AS [Bookname] FROM [Books] WHERE [Books].[author_id] = [test].[ID]"
之类的SQLquery创建使用此查询的记录集但是我坚持在这里 - 我试图检查这个东西是否有效但是它说错误3061
Private Sub authorlist_Click()
Dim dbs As Database, authorsRS, booksRS As Recordset, queryStr, idbynameQuery, srchASurStr, strOutput, srId As String, qdf As QueryDef
Set dbs = CurrentDb()
srchASurStr = InputBox("Input author surname, please", , , 100, 100)
strQuery = "SELECT [Authors].[author_id] AS [ID] FROM [Authors] WHERE [Authors].[last_name] = " & srchASurStr & ""
Set authorsRS = dbs.OpenRecordset(strQuery, dbOpenSnapshot)
With dbs
Set qdf = .CreateQueryDef("test", strQuery)
DoCmd.OpenQuery "test"
.QueryDefs.Delete "test"
End With
End Sub
那么你能帮我解释一下是什么问题吗?有没有更简单的方法来显示某些作者的所有书籍(可能没有使用SQL查询)?
答案 0 :(得分:1)
SQL语句中的字符串值需要用单引号('
)或双引号("
)包围:
SELECT author_id FROM authors WHERE last_name = "Smith"
如果没有引号而写:
SELECT author_id FROM authors WHERE last_name = Smith
Smith
将被理解为字段名称而不是字符串值。所以你的代码应该是这样的:
'Chr returns a string from a character code. 34 is the code for "
strQuery = "SELECT author_id FROM authors WHERE last_name = " & Chr(34) & srchASurStr & Chr(34)
在VBA中,您可以通过将双引号加倍来转义双引号:
strQuery = "SELECT author_id FROM authors WHERE last_name = """ & srchASurStr & """"
<小时/> SQL注入:请记住,如果用户输入了一个包含
"
的字符串,则可能会出现错误,因为生成的SQL语句的语法无效:
SELECT author_id FROM authors WHERE last_name = "Smi"th"
避免此问题的正确方法是使用参数。
<小时/> 一些注意事项:
[Forms]![FormName]![ControlName]
。因此,您可以创建一个基于表单文本框过滤的已保存查询,而不是使用输入框。author_id
),显示的值是另一个表达式(last_name
或last_name & " " & first_name
)。如果将ColumnWidths属性设置为0(对于第一列),则将显示下一列如果您更喜欢使用文本框,请考虑在查询中使用LIKE
运算符,以显示last_name
包含用户字符串的所有作者:
SELECT author_id FROM authors WHERE last_name LIKE "%sm%"
将返回Smith,Smythe和Asmodeus。
答案 1 :(得分:0)
我建议你设置一个表单和子表单。表单可以包含作者详细信息,子表单可以包含该作者的书籍,您可以进一步添加文本框,用户可以使用部分作者姓名填写该文本框。然后,您可以将过滤器应用于主窗体,以显示具有该名称的所有作者。
Me.Filter = "Author Like '*" & Me.Search & "*'"
Me.FilterOn = True
有许多变体,用户可以从组合或列表框中选择名称。表单可以是一个连续的表单,在标题中有过滤/搜索等等。