根据表单中选择的不同条件搜索Access记录

时间:2014-11-25 08:04:51

标签: vb.net visual-studio-2010 ms-access

在使用VB.NET的WinForms应用程序中,我已经从MS Access访问了三个表,并将结果显示在DataGridView控件中。 现在,我使用三种不同的条件来搜索访问记录,如下所示:

  1. 电话号码复选框(如果选中相应的文本框将被启用)
  2. ItemName的复选框(如果选中相应的文本框将被启用)
  3. 年份,月份和日期的三个单选按钮(如果选择了相应的datetimepicker,将启用)
  4. 在这些条件下,有一个搜索按钮。

    选择上述一个或两个以上或上述条件的组合后,输入值,点击搜索按钮,我想在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 ....
    

    通过这种方式,会有很多可能的搜索组合。

    我对这种语言更新一点。所以,请以简单的方式呈现信息。

2 个答案:

答案 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))。但是,如果可能的话,最好将大多数值设为必需;处理数据中的空值并不是特别有趣。