【问题标题】:Search in form1 and display it to the form2 using vb.net windows form在form1中搜索并使用vb.net windows窗体将其显示到form2
【发布时间】:2020-10-23 04:36:49
【问题描述】:

在我的表单 1 中,我有一个文本框,用户可以在其中输入他们的员工编号,我还有第二个表单,该表单将显示该客户的数据。

这是我的第一个表格

Dim dt As New DataTable
Dim EmployeeNumber = EmployeeNumber_TextBox1.Text.Trim()
Try
    Using MyCon As New Odbc.OdbcConnection("Driver={PostgreSQL ANSI};database=contacttracing;server=localhost;port=5432;uid=ctadmin;sslmode=disable;readonly=0;protocol=7.4;User ID=*****;password=*****;"),
            cmd As New Odbc.OdbcCommand("SELECT firstname   FROM ""TracingApp_fmcustomeremployeesupplier"" where employee_number='" & EmployeeNumber & "' ", MyCon)
        MyCon.Open()
        dt.Load(cmd.ExecuteReader)

        EmployeeInformation.Show()

    End Using
Catch ex As Exception
    MessageBox.Show(ex.Message)
End Try

当员工在form1中输入他们的号码时,我该怎么做,数据将显示在form2文本框中?

表格1

form2

我的 form2 中还没有代码,因为我不知道如何从 form1 获取数据并将其显示到 form2

【问题讨论】:

  • 数据库中employee_number的数据类型是什么?
  • 为什么不在 Form1 中显示这些信息,第二个 Form 似乎没有必要。 DataTable 似乎也不需要。如果两者都是,则向 Form2 添加一个公共方法(例如,public sub SetDataSource(dt as DataTable))并将 DataTable 传递给 Form2 的 新实例。或者传递与 Columns 值对应的字符串——顺便说一句,您查询的只是firstname :)(还有 Mary 所问的)

标签: vb.net postgresql


【解决方案1】:

始终使用参数。用户输入可能是恶意的。参数向数据库表明这只是一个值而不是可执行代码。参数有助于防止sql注入。

我更改了控件的名称以匹配我的测试程序。当然,在您的代码中,您会使用描述性名称。

在您CommandText 中,选择您需要显示的所有字段。我不得不猜测字段的名称。检查您的数据库以获取正确的名称。在 Where 子句中使用参数的名称。

当您.Add 参数时,请检查您的数据库中的数据类型是否正确。由于您的代码在单引号中包含参数的值,我猜想VarChar。如果它是 Int 或其他数字类型,请确保为 CInt(TextBox1.Text) 或您需要更改的任何数据类型。您可能已经在别处验证了输入。

只有在连接和命令处理完毕后,我们才开始使用返回的数据。

vb.net 可以使用所谓的“默认实例”表单。这就是为什么这段代码有效。您也可以创建自己的实例。

dt(0)(0).ToString

这是指DataTable 中的第一行第一列。 (.net 中的数组和集合是从零开始的)

dt(0)(1).ToString

指第一行、第二列或DataTable等。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim dt As New DataTable
    Dim EmployeeNumber = TextBox1.Text.Trim()
    Try
        Using MyCon As New Odbc.OdbcConnection("Driver={PostgreSQL ANSI};database=contacttracing;server=localhost;port=5432;uid=ctadmin;sslmode=disable;readonly=0;protocol=7.4;User ID=*****;password=*****;"),
                cmd As New Odbc.OdbcCommand("SELECT firstname, middlename, lastname FROM ""TracingApp_fmcustomeremployeesupplier"" where employee_number= @empNum' ", MyCon)
            cmd.Parameters.Add("@empNum", OdbcType.VarChar).Value = EmployeeNumber
            MyCon.Open()
            dt.Load(cmd.ExecuteReader)
        End Using
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
    Form2.TextBox1.Text = dt(0)(0).ToString
    Form2.TextBox2.Text = dt(0)(1).ToString
    Form2.TextBox3.Text = dt(0)(2).ToString
    Form2.Show()
End Sub

【讨论】:

  • 更新了 Select 字符串,以便在 PostGres 上的 @Caius Jard 回答中为表名添加引号,将其更改为全部小写。
【解决方案2】:

您至少还有两个选择:

  1. 从 Form1 向 Form2 发送一个事件,这是一种更安全的方法。如果用户关闭了 Form2,那么 Form1 将触发异常,除非您检查 Form2 确实已加载且可访问。我认为广播事件并让目标表单对其做出反应更优雅。

  2. 重载目标表单的Show(或ShowDialog)方法

您可以像这样在 Form2 中重载 Show 方法:

Public Class Form2
    Inherits System.Windows.Forms.Form

    Public Overloads Sub Show(ByVal ContactD As Integer)
        ' load the contact from DB
        MyBase.Show()
    End Sub

End Class

基本上,您可以为该方法添加一个替代声明。然后在 Form1 中像这样实例化 Form2:

Dim frm2 as new Form2
frm2.Show(123456) ' ContactID value

然后让 Form2 从数据库中获取数据。所以我认为发送联系人 ID 或一些主键就足够了,但如果需要,您可以发送更多变量。在这种情况下,您可以发送 DataRow。

【讨论】:

    猜你喜欢
    • 2013-04-19
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多