Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在form1中搜索,并使用vb.net windows窗体将其显示到form2_Vb.net_Postgresql - Fatal编程技术网

在form1中搜索,并使用vb.net windows窗体将其显示到form2

在form1中搜索,并使用vb.net windows窗体将其显示到form2,vb.net,postgresql,Vb.net,Postgresql,在我的表单1中,我有一个文本框,用户在其中输入他们的员工编号,我还有一个表单,该客户机的数据将在其中显示 这是我的第一张表格 Dim dt As New DataTable Dim EmployeeNumber = EmployeeNumber_TextBox1.Text.Trim() Try Using MyCon As New Odbc.OdbcConnection("Driver={PostgreSQL ANSI};database=contacttracing;serv

在我的表单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

表格2

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

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

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

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

添加参数时,请检查数据库中的数据类型是否正确。由于代码中的参数值用单引号括起来,所以我猜是VarChar。如果是Int或其他数字类型,请确保使用CIntTextBox1.Text或任何需要更改的数据类型。您可能已经在其他地方验证了输入

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

vb.net可以使用所谓的默认窗体实例。这就是为什么这个代码起作用。您还可以创建自己的实例

dt(0)(0).ToString
这是指数据表中的第一行、第一列。net中的数组和集合是基于零的

dt(0)(1).ToString
指第一行、第二列或数据表等

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

您至少还有两个选择:

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

重载目标窗体的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
Dim frm2 as new Form2
frm2.Show(123456) ' ContactID value
基本上,您可以为该方法添加一个替代声明。然后在Form1中实例化Form2,如下所示:

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
Dim frm2 as new Form2
frm2.Show(123456) ' ContactID value

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

数据库中员工编号的数据类型是什么?为什么不在表格1中显示这些信息呢?第二个表格似乎没有必要。DataTable似乎也不是必需的。如果两者都是,则向Form2添加一个公共方法,例如,public sub SetDataSourcedt as DataTable,并将该DataTable传递给Form2的一个新实例。或者传递与列值相对应的字符串-顺便说一句,您只是在查询firstname:Mary还询问了一些问题。根据PostGres上的@Caius Jard answer,将Select字符串的日期改为在表名周围添加引号,并将其改为所有小写。