【问题标题】:Filtering by ID column按 ID 列过滤
【发布时间】:2021-10-20 17:23:51
【问题描述】:

我正在尝试按 ID (PID) 列从 Visual Studio 中的 Ms access DB 中过滤一个表,但我不知道如何将 int 转换为字符串或使其工作。

请有任何想法。

    con.ConnectionString = dbProvider & dbSource
    con.Open()

    If PIDfindTextBox.Text = "" Then
        MessageBox.Show("Please enter a Patient ID number")
    Else
        PatienrocordBindingSource.Filter = "((PID,'system.string') like '" & PIDfindTextBox.Text & "')"
        If PatienrocordBindingSource.Count <> 0 Then
            With dataGridView1.DataSource = PatienrocordBindingSource
            End With
        Else
            MessageBox.Show("Searched Patient ID was not found")
            PatienrocordBindingSource.Filter = Nothing
        End If
    End If
End Sub

【问题讨论】:

  • 谢谢您的回答

标签: vb.net ms-access-2010


【解决方案1】:

您的代码非常混乱。它打开一个数据库连接,然后设置一个 bindingsource 过滤器,这不是真正的事情

绑定源是一种位于数据模型(如数据表(不是数据库中的表))和 UI 元素(如 datagridview 或其他控件)之间的设备。 bindingsource 可以过滤它在模型中找到的数据。这些都与首先用数据填充模型无关,这通常是通过将其从数据库中提取出来来完成的

您可能完全可以避免与数据库连接进行交互;如果您使用 OledbDataAdapter,您可以从数据库中提取数据并将其加载到程序内存中的数据表中

因此,您可以选择过滤数据的位置。您可以将整个数据库加载到程序的内存中,然后根据需要使用 bindingsource 过滤器只显示一个 - 所有数据都存在于数据表中,只有其中一部分通过 bindingsource ..

或者你只是将部分数据从数据库中下载到数据表中,然后就不需要在bindingsource中过滤了

您还可以采用混合方法,例如将 10 条记录加载到数据表中,然后在绑定源中进行过滤


选择您的方案 - 大多数人选择中间方案,您只需下载所需的数据。那里有很多例子,但作为一个粗略的模板,我会搜索数据库表并提取结果如下所示:

Dim da as New OleDbDataAdapter("SELECT * FROM Person WHERE Id =?", "connection string here")
da.SelectCommand.Parameters.AddWithValue("id", Convert.ToInt32(idTextbox.Text))
Dim dt as New DataTable
da.Fill(dt)
bindingsource.DataSource = dt

如果您的数据表中有 10 行,并且只想过滤到某个 id

bindingsource.Filter = "[Id] = " & idFilterTextBox.Text

您不需要同时使用这两种方法;使用适合您的上下文的那个

【讨论】:

  • 谢谢你的回复我对编程很陌生,所以我知道我之前的问题可能听起来很傻我认为 Oi 以错误的方式提出了这个问题,所以有 2 个表格,1 个表格数据已被插入到表 ia 数据库中,然后我有这个表单,我想在其中搜索上一个表以仅显示一个记录(行)以获得我在文本框中输入的一个 ID 号,因此我正在尝试创建一个搜索按钮但主要问题是我的 PID 列是 int 和 bindingsource,fillter 再次使用 string 非常感谢您的帮助和回答
  • 我设法通过文本更改事件 con.ConnectionString = dbProvider &amp; dbSource con.Open() Dim dt As New DataTable Dim ds As New DataSet ds.Tables.Add(dt) Dim da As New OleDbDataAdapter da = New OleDbDataAdapter("Select * From Patien_rocord where PID Like '%" &amp; PIDfindTextBox.Text &amp; "%'", con) da.Fill(dt) dataGridView1.DataSource = dt.DefaultView con.Close() 做到了这一点,非常感谢您的帮助
  • 我写的那行da.SelectCommand.Parameters.AddWithValue...相当重要;你应该这样做。有关原因的讨论,请参阅bobby-tables.com。我也很困惑,鉴于我给了你一个完整且可行的代码,只需要非常小的调整,你设法添加了另外 5 行不必要的。你不需要创建连接 -数据适配器会做到这一点。如果您确实创建了连接,则无需打开和关闭它- dataadapter 会这样做。您不需要将数据表添加到 DataSet。 DGV 会自动使用默认视图
  • All in,这将是更可取的:Dim da as New OleDbDataAdapter("SELECT * FROM Patien_roccord WHERE PID like ?", dbProvider &amp; dbSource)da.SelectCommand.Parameters.AddWithValue("id", "%" &amp; PIDfindTextBox.Text &amp; "%")Dim dt as New DataTableda.Fill(dt)PatienrocordBindingSource.DataSource = dtdataGridView1.DataSource = PatienrocordBindingSource - 减少混乱,参数化查询,保持绑定源对其他事情很有用,但是不需要100(可以将网格的DataSource设置为dt)
猜你喜欢
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多