在使用VB.NET的WinForms应用程序中,我已经从MS Access访问了三个表,并将结果显示在DataGridView控件中。 现在,我使用三种不同的条件来搜索访问记录,如下所示:
在这些条件下,有一个搜索按钮。
选择上述一个或两个以上或上述条件的组合后,输入值,点击搜索按钮,我想在DataGridView中显示结果。
用户可以仅选择第一个条件(PhoneNumber)或仅选择第二个条件(ItemName)或仅选择其中一个单选按钮(年/月/日),或者可以选择多个条件,然后只能选择“搜索”按钮。因此,用户可以选择多种选择。
我是否必须为访问记录(Else If
语句)的每个可能选择编写代码,如下所示?
If chkPhoneNumber.checked= True Then
RunQuery("SELECT ...... WHERE txtPhoneNumber.Text = '...'")
Elseif chkItemName.checked= True Then
RunQuery("SELECT ...... WHERE txtItemName.Text = '...'")
Elseif chkPhoneNumber.Checked= True ANd chkItemName.checked= True Then
RunQuery("SELECT ...... WHERE txtPhoneNumber.Text = '..' And txtItemName.Text = '...'")
'Similar search for others too
Elseif rdbYear.checked= True Then
RunQuery("....")
Elseif rdbMonth.checked= True
RunQuery("....")
Elseif rdbDay.checked= True
RunQuery("....")
Elseif chkPhoneNumber.Checked= True ANd chkItemName.checked= True ANd rdbYear.checked= True
RunQuery("....")
Elseif ....
Elseif ....
Elseif ....
Endif ....
通过这种方式,会有很多可能的搜索组合。
我对这种语言更新一点。所以,请以简单的方式呈现信息。
答案 0 :(得分:1)
您可以执行类似
的操作,而不是使用If-ElseIf Dim checkedControls As New List(Of Control)
For Each Control In Me.Controls
If TypeOf Control Is CheckBox AndAlso CType(Control, CheckBox).Checked Then
checkedControls.Add(CType(Control, CheckBox))
End If
Next
现在您拥有了所有已检查的控件,只需遍历列表即可动态创建查询。
答案 1 :(得分:0)
如果可能,您将希望避免动态构建SQL语句(主要是因为它允许SQL注入漏洞和错误)。相反,SQL参数是最好的,并且查询本身应设计为仅在传入有效(非null /空)参数时才应用每个条件。此类查询的部分示例:
PARAMETERS ParPhoneNumber Text ( 10 ), ParItemName Text ( 255 );
SELECT …
FROM …
WHERE Nz([PhoneNumber]=[ParPhoneNumber], True) AND Nz([ItemName]=[ParItemName], True);
空传播意味着如果PhoneNumber本身或其对应的搜索参数为null,则[PhoneNumber]=[ParPhoneNumber]
条件将为null,然后Nz确保空传播在True处停止。同样适用于其他条件。
要传递参数,如果您使用OleDb(未经测试),这样的事情应该可以解决问题:
cmd.Parameters.AddWithValue("ParPhoneNumber", IIf(chkPhoneNumber.Checked, txtPhoneNumber.Text, DBNull))
(否则,请查看您使用.NET中使用的任何API传递参数;这是一个单独的问题。)
*如果要排除记录中的空值,请先使用Nz来提出与任何内容不匹配的内容(可能是Nz(Nz([PhoneNumber], "!!!!!!!!!!!!!!!!!")=[ParPhoneNumber], True)
)。但是,如果可能的话,最好将大多数值设为必需;处理数据中的空值并不是特别有趣。