我正在开发一个食谱库。我有一个带有 3 个列表框(lstIngredient、lstSelected、lstRecipe)和一个查找按钮的表单。lstIngredient 填充了存储在数据库中的成分名称。
当用户在 lstIngredient 中选择(双击)一个名称时,它将被列出到 lstSelected。之后,当用户单击查找按钮时,它将在数据库中找到哪些食谱使用了这些成分。数据库中的表如下所示:
id | recipe | ingredient
1 | spaghetti | tomato sause
2 | spaghetti | cheese
3 | spaghetti | hotdog
4 | burger | bread bun
5 | burger | burger patty
6 | burger | cheese
所以在这里,假设用户选择了cheese
,bread bun
并且hotdog
(注意:这些项目是一一选择的),这些将在 lstSelected 中列出。单击查找按钮时,结果应为burger
and spaghetti
。如果您注意到,汉堡是列表中的第一项。这是一个示例,lstRecipe 中的结果应取决于所选成分的出现次数。这是我所做的:
Call Connect()
Dim dt As New DataTable
Dim cmd As New MySqlCommand
Try
lstRecipe.Items.Clear()
cmd.Connection = myConn
cmd.CommandText = "select recipe from cook_book where ingredient = @item"
cmd.Parameters.AddWithValue("item", lstSelected.Items)
myReader = myCmd.ExecuteReader
If (myReader.Read()) Then
myReader.Close()
myAdptr.SelectCommand = cmd
myAdptr.Fill(dt)
lstRecipe.DisplayMember = "recipe"
For Each row As DataRow In dt.Rows
lstRecipe.Items.Add(row("recipe"))
Next
Dim builder As New StringBuilder()
builder.Append("select distinct recipe from cook_book where")
For y As Integer = 0 To lstSelected.Items.Count - 1
Dim parameterName As String = "@item" & y.ToString()
If y <> 0 Then
builder.Append("and ")
End If
builder.Append(parameterName)
builder.Append(" in (select ingredient from cook_book where recipe = i.recipe) ")
cmd.Parameters.AddWithValue(parameterName, lstSelected.Items(y))
Next
cmd.CommandText = builder.ToString()
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
cmd = Nothing
myReader = Nothing
myConn.Close()
Call Disconnect()
该代码位于 btnFind_Click 事件下。我没有收到任何错误,但它没有按应有的方式运行。它只找到用户选择的最后一种成分的最后一个配方。