在Listview中插入来自两个不同数据库(MySQL和SQL)的值
我正在使用两个不同的数据库,一个是SQL server,另一个是MySQL 我正试图在他们之间交换数据。 2 DB有一个共同的产品参考。但两者都使用非常不同的数据 例如,在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
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