如何使用来自 msaccess 表的过滤数据填充 vb.net 中的组合框

Posted

技术标签:

【中文标题】如何使用来自 msaccess 表的过滤数据填充 vb.net 中的组合框【英文标题】:How to populate a combobox in vb.net with filtered data from an msaccess table 【发布时间】:2012-05-10 08:58:21 【问题描述】:

如果能得到任何帮助,我将不胜感激。

我的问题是我已将 Combobox1 绑定到 BindingSource 并且 DataMember 和 ValueMember 属性已链接并正常工作。对于我的一生,我不知道如何使用 Combobox1 的值(选定的 valuemember)来过滤我在 Combobox2 上显示的结果。我迫切需要一种简单的方法来做到这一点。

我的失败代码在下面

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    Dim conn As New SqlConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Database1.mdb") 'This line fails

    Dim strSQL As String = "SELECT * FROM Questions WHERE Section='" & ComboBox1.ValueMember & "'"
    Dim da As New SqlDataAdapter(strSQL, conn)
    Dim ds As New DataSet
    da.Fill(ds, "Disk")

    With ComboBox2 'Here i try to populate the combobox2
        .DataSource = ds.Tables("Questions")
        .DisplayMember = "Question_String"
        .ValueMember = "Question_Code"
        .SelectedIndex = 0
    End With
End Sub

我不断收到如下系统级错误 "不支持关键字:'provider'。"

我尝试了其他一些选项,但我得到的错误似乎更神秘,有人可以帮我解决这个问题。我会很感激的。

【问题讨论】:

【参考方案1】:

Dim conn As New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='|DataDirectory|\Database1.mdb'")

此外,您的查询必须使用字符串而不是对象,因此请尝试...

Dim strSQL As String = "SELECT * FROM Questions WHERE Section='" & ComboBox1.ValueMember.toString & "'"

【讨论】:

【参考方案2】:

因为您将提供程序用于不需要它的连接,因为提供程序应该是 SQL 驱动程序。

我不知道你使用的是什么数据库(嗯,该文件是一个访问文件),但你需要检查你有正确的连接字符串

见http://www.connectionstrings.com/sql-server-2008#p2

【讨论】:

【参考方案3】:

以下是对您的代码的一些观察,希望对您有所帮助:

首先,您可能想查看此 MSDN 帮助,了解如何将数据库连接字符串从代码中移出并移入配置文件。这对于您的代码在不同环境(开发箱、登台、生产等)中更顺畅地工作尤其重要 - Connection Strings and Configuration Files (ADO.NET)

我还注意到您从未明确打开或关闭连接。根据this entry on stack overflow,您应该没问题,但请记住,如果您碰巧更改代码以显式打开连接,您还需要关闭它。

我还注意到您没有使用参数化查询。这使您的代码容易受到 SQL 注入攻击。 Here 是 Scott Guthrie 的博客文章“提示/技巧:防范 SQL 注入攻击”的链接。您永远不知道谁会使用这种不良做法复制和粘贴您的代码块。

最后,您执行以下查询(使用其他答案中的适当模块:

Dim strSQL As String = "SELECT * FROM Questions WHERE Section='" & ComboBox1.ValueMember.toString & "'"

随后仅在您的代码中使用 Question_String 和 Question_Code。您可能需要考虑将查询更改为仅提取您需要的列。当您有包含许多列的表时,这尤其有用。否则,您将不必要地提取代码实际上不需要的数据。所以你的查询会变成:

   Dim strSQL As String = "SELECT Question_String, Question_Code FROM Questions WHERE Section='" & ComboBox1.ValueMember.toString & "'"

【讨论】:

以上是关于如何使用来自 msaccess 表的过滤数据填充 vb.net 中的组合框的主要内容,如果未能解决你的问题,请参考以下文章

基于多表 MSAccess 的报表

如何使用来自两个不同表的旧信息自动填充编辑表单?

这个表格是如何绑定的?

如何在第三个查询中包含来自其他两个表的过滤行数?

使用宏过滤带有组合框的表单 - MS Access

在同一页面上提交表单时如何预填充下拉列表?