在Listview中插入来自两个不同数据库(MySQL和SQL)的值

在Listview中插入来自两个不同数据库(MySQL和SQL)的值,mysql,sql,vb.net,Mysql,Sql,Vb.net,我正在使用两个不同的数据库,一个是SQL server,另一个是MySQL 我正试图在他们之间交换数据。 2 DB有一个共同的产品参考。但两者都使用非常不同的数据 例如,在Mysql中,我有一些简单的数据,比如,描述、价格、类型。。。。 在SQL中,我有最后使用的价格、折扣、条形码。。。。 但是有些产品在两个数据库中都没有数据,所以在某些字段中它们必须保持为空。 我必须把这些数据放到一个列表视图中 到目前为止,我有以下代码: Private Sub button_search_Click

我正在使用两个不同的数据库,一个是SQL server,另一个是MySQL

我正试图在他们之间交换数据。 2 DB有一个共同的产品参考。但两者都使用非常不同的数据

例如,在Mysql中,我有一些简单的数据,比如,描述、价格、类型。。。。 在SQL中,我有最后使用的价格、折扣、条形码。。。。 但是有些产品在两个数据库中都没有数据,所以在某些字段中它们必须保持为空。 我必须把这些数据放到一个列表视图中

到目前为止,我有以下代码:

    Private Sub button_search_Click(sender As Object, e As EventArgs) Handles button_search.Click


    '--------------------------------MySQL

    Call connect()

    Dim marca_prod As String
    Dim fam_prod As String
    Dim tipo_prod As String
    Dim sql As String

    rs = New ADODB.Recordset


    If type_1.Checked Then
        tipo_prod = "1"
    ElseIf type_2.Checked Then
        tipo_prod = "2"
    Else
        tipo_prod = ""
    End If


    If proc_desc.Checked Then
        sql = "SELECT p.referencia AS Referencia, p.descricao AS Descrição, p.tipo AS Tipo, f.nome_familia AS Familia, m.nome_marca AS Marca FROM ((produtos AS p INNER JOIN familias AS f ON p.Id_familia = f.Id_familia) INNER JOIN marcas AS m ON p.Id_marca = m.Id_marca) WHERE p.descricao LIKE '%" & Prod_input.Text & "%' AND p.tipo LIKE '" & tipo_prod & "%' "
    ElseIf proc_ref.Checked Then
        sql = "SELECT p.referencia AS Referencia, p.descricao AS Descrição, p.tipo AS Tipo, f.nome_familia AS Familia, m.nome_marca AS Marca FROM ((produtos AS p INNER JOIN familias AS f ON p.Id_familia = f.Id_familia) INNER JOIN marcas AS m ON p.Id_marca = m.Id_marca) WHERE p.referencia LIKE '%" & Prod_input.Text & "%' AND p.tipo LIKE '" & tipo_prod & "%' "
    Else
        sql = "SELECT p.referencia AS Referencia, p.descricao AS Descrição, p.tipo AS Tipo, f.nome_familia AS Familia, m.nome_marca AS Marca FROM ((produtos AS p INNER JOIN familias AS f ON p.Id_familia = f.Id_familia) INNER JOIN marcas AS m ON p.Id_marca = m.Id_marca) WHERE (p.referencia LIKE '%" & Prod_input.Text & "%' OR p.descricao LIKE '%" & Prod_input.Text & "%') AND p.tipo LIKE '" & tipo_prod & "%' "
    End If

    rs.Open(sql, conn)

    query_results.Items.Clear()

    While Not rs.EOF
        Dim lv As New ListViewItem
        lv = query_results.Items.Add(rs.Fields(0).Value)
        lv.SubItems.Add(rs.Fields(1).Value)
        lv.SubItems.Add(rs.Fields(2).Value)
        lv.SubItems.Add(rs.Fields(3).Value)
        lv.SubItems.Add(rs.Fields(4).Value)

        rs.MoveNext()
    End While


    '-----------------------------SQL

    Dim myDBCnn As SqlConnection
    Dim myDBCmd As SqlCommand
    Dim myDBReader As SqlDataReader
    myDBCnn = New SqlConnection("************")
    myDBCnn.Open()
    Dim MystrQ As String

    Dim i = 0
    While Not rs.EOF
        MystrQ = "Select stock, epcult, epcpond FROM st WHERE ref ='" & rs.Fields(0).Value & "'"
        myDBCmd = New SqlCommand(MystrQ, myDBCnn)
        myDBReader = myDBCmd.ExecuteReader
        While myDBReader.Read
            Dim lv As New ListViewItem
            lv = query_results.Items.Add(myDBReader.Item(5))
            lv.SubItems.Add(myDBReader.Item(6))
            lv.SubItems.Add(myDBReader.Item(7))
        End While
    End While

    myDBReader.Close()
        myDBCmd.Dispose()
        myDBCnn.Close()

        If query_results.Items.Count = 0 Then
        MsgBox("Não foram encontrados registos para os parametros selecionados!")

    End If

    count_label.Text = query_results.Items.Count

End Sub
此时,我在myDBReader.Close()的末尾发现一个错误->“对象引用未设置为对象的实例” 但我认为另一个代码是不对的。
我能做什么?

我将数据访问代码与用户界面代码分开。这将使您的应用程序更易于维护。数据库函数是传递的值,因此它们不依赖于值的来源。用户界面不依赖于数据来自何处。它可以是文本文件、web服务或任何类型的数据库

我抛弃了ADODB和记录集,它们是非常古老的技术,使用的是直接的ADO.net。这将需要MySql提供程序的导入

Imports MySql.Data.MySqlClient
即使出现错误,
Using…End Using
也会阻止关闭和处理数据库对象

始终使用参数从不连接字符串以生成sql语句。我不得不猜测参数的数据类型。检查数据库并根据需要调整代码

Private ConStrMySql As String = "Your connection string"
Private ConStrSql As String = "Your connection string"

Private Sub button_search_Click(sender As Object, e As EventArgs) Handles button_search.Click
    Dim tipo_prod As String
    If type_1.Checked Then
        tipo_prod = "1"
    ElseIf type_2.Checked Then
        tipo_prod = "2"
    Else
        tipo_prod = ""
    End If
    Dim dt = GetMySqlData(proc_desc.Checked, proc_ref.Checked, Prod_input.Text, tipo_prod)
    query_results.Items.Clear()
    For Each row As DataRow In dt.Rows
        Dim lv As New ListViewItem
        lv.Text = row(0).ToString
        lv.SubItems.Add(row(1).ToString)
        lv.SubItems.Add(row(2).ToString)
        lv.SubItems.Add(row(3).ToString)
        lv.SubItems.Add(row(4).ToString)
        Dim dt2 = GetSqlData(row(0).ToString)
        lv.SubItems.Add(dt2.Rows(0)(0).ToString)
        lv.SubItems.Add(dt2.Rows(0)(1).ToString)
        lv.SubItems.Add(dt2.Rows(0)(2).ToString)
        query_results.Items.Add(lv)
    Next
    If query_results.Items.Count = 0 Then
        MsgBox("Não foram encontrados registos para os parametros selecionados!")
    End If
    count_label.Text = query_results.Items.Count.ToString
End Sub

Private Function GetMySqlData(ProcDesc As Boolean, ProcRef As Boolean, ProdInput As String, tipo As String) As DataTable
    Dim sql = "SELECT p.referencia AS Referencia, p.descricao AS Descrição, p.tipo AS Tipo, f.nome_familia AS Familia, m.nome_marca AS Marca FROM ((produtos AS p INNER JOIN familias AS f ON p.Id_familia = f.Id_familia) INNER JOIN marcas AS m ON p.Id_marca = m.Id_marca) "
    If ProcDesc Then
        sql &= "WHERE p.descricao Like @Prod AND p.tipo LIKE @Type;"
    ElseIf ProcRef Then
        sql &= "WHERE p.referencia LIKE @Prod AND p.tipo LIKE @Type;"
    Else
        sql &= "WHERE (p.referencia LIKE @Prod OR p.descricao LIKE @Prod) AND p.tipo LIKE @Type;"
    End If
    Dim dt As New DataTable
    Using conn As New MySqlConnection(ConStrMySql),
            cmd As New MySqlCommand(sql, conn)
        cmd.Parameters.Add("@Prod", MySqlDbType.VarChar).Value = "%" & ProdInput & "%"
        cmd.Parameters.Add("@Type", MySqlDbType.VarChar).Value = tipo & "%"
        conn.Open()
        Using reader = cmd.ExecuteReader
            dt.Load(reader)
        End Using
    End Using
    Return dt
End Function

Private Function GetSqlData(Ref As String) As DataTable
    Dim dt As New DataTable
    Using conn As New SqlConnection(ConStrSql),
            cmd As New SqlCommand("Select stock, epcult, epcpond FROM st WHERE ref = @Ref", conn)
        cmd.Parameters.Add("@Ref", SqlDbType.VarChar).Value = Ref
        conn.Open()
        Using reader = cmd.ExecuteReader
            dt.Load(reader)
        End Using
    End Using
    Return dt
End Function
编辑

要使tipo成为Int16(vb.net中的缩写),您需要做的不仅仅是更改参数的数据类型

更正tipo_prod值的设置

    Dim tipo_prod As Short
    If type_1.Checked Then
        tipo_prod = 1
    ElseIf type_2.Checked Then
        tipo_prod = 2
    Else
        tipo_prod = 0
    End If
更正MySql函数的签名

    Private Function GetMySqlData(ProcDesc As Boolean, ProcRef As Boolean, ProdInput As String, tipo As Short) As DataTable
更正sql语句。一个数字“像”另一个数字可能意味着什么

您是否在工作台和SSMS中检查了sql的语法

编辑2

如果SQL Server数据库中没有匹配的数据,请忽略它

    For Each row As DataRow In dt.Rows
        Dim lv As New ListViewItem
        lv.Text = row(0).ToString
        lv.SubItems.Add(row(1).ToString)
        lv.SubItems.Add(row(2).ToString)
        lv.SubItems.Add(row(3).ToString)
        lv.SubItems.Add(row(4).ToString)
        Dim dt2 = GetSqlData(row(0).ToString)
        If dt2.Rows.Count > 0 Then
            lv.SubItems.Add(dt2.Rows(0)(0).ToString)
            lv.SubItems.Add(dt2.Rows(0)(1).ToString)
            lv.SubItems.Add(dt2.Rows(0)(2).ToString)
        End If
        query_results.Items.Add(lv)
    Next

Helo,谢谢你详细的回答。由于输入字符串的格式不正确,我在使用reader=cmd.ExecuteReader时遇到错误。我知道你警告过我DB中的数据类型,所以我让ProdInput作为Varchar,tipo作为Int16。在数据库中,它们分别是varchar和Integer。我更改了代码中的所有数据类型以进行匹配,但得到了相同的错误。我认为问题在于SQL字符串没有得到@Prod和@Type的值,它们就像我写的那样,所以没有值。所以问题出在我的脚本上,但我纠正了这个问题。但是,当sql数据库中不存在产品时,我该如何处理这种情况呢?因为我得到了一个错误。@Rwolf27我在编辑中处理了您的第一条评论。见编辑2为您的第二条评论。工作完美,非常感谢!!!
    For Each row As DataRow In dt.Rows
        Dim lv As New ListViewItem
        lv.Text = row(0).ToString
        lv.SubItems.Add(row(1).ToString)
        lv.SubItems.Add(row(2).ToString)
        lv.SubItems.Add(row(3).ToString)
        lv.SubItems.Add(row(4).ToString)
        Dim dt2 = GetSqlData(row(0).ToString)
        If dt2.Rows.Count > 0 Then
            lv.SubItems.Add(dt2.Rows(0)(0).ToString)
            lv.SubItems.Add(dt2.Rows(0)(1).ToString)
            lv.SubItems.Add(dt2.Rows(0)(2).ToString)
        End If
        query_results.Items.Add(lv)
    Next