如何在VB.net中使用多个结果

问题描述 投票:0回答:1

我需要在3个文本框中显示在同一条语句中进行的3个查询的结果。

我有两个在mysql中称为personal_sueldospersonal_haberes的表。它们都有相同的列。我需要在两个查询中都选择相同的信息,第三个查询是从descuentos中减去haberes。因此,我必须以VB.NET形式在3个文本框中显示所有3个结果。

MySql中的查询代码:

SELECT SUM(importe) FROM personal_haberes WHERE persona_doc = 55880334 AND mes = 11 AND año = 2019;

SELECT SUM(importe) FROM personal_descuentos WHERE persona_doc = 55880334 AND mes = 11 AND año = 2019;

SELECT (SELECT SUM(importe) FROM personal_haberes WHERE persona_doc = 
55880334 AND mes = 11 AND año = 2019) -
(SELECT SUM(importe) FROM personal_descuentos WHERE persona_doc = 
55880334 AND mes = 11 AND año = 2019) as importeTotal

VB.NET中的代码:

cnn.Open()
Dim Query As String
Query = "SELECT SUM(importe) as ImporteHaberes FROM personal_haberes WHERE persona_doc  = " & Module1.document & " AND mes = " & HR_DatePicker.Value.Month & " AND año = " & HR_DatePicker.Value.Month & ";" & _
"SELECT SUM(importe) as ImporteDescuentos FROM personal_descuentos WHERE persona_doc = " & Module1.document & " AND mes = " & HR_DatePicker.Value.Month & " AND año = " & HR_DatePicker.Value.Month & ";" & _
"SELECT (SELECT SUM(importe) FROM personal_haberes WHERE persona_doc    = " & Module1.document & " AND mes = " & HR_DatePicker.Value.Month & " AND año = " & HR_DatePicker.Value.Month & ";) -" & _
"(SELECT SUM(importe) FROM personal_descuentos WHERE persona_doc = " & Module1.document & " AND mes = " & HR_DatePicker.Value.Month & " AND año = " & HR_DatePicker.Value.Month & ";) AS ImporteTotal"
Dim cmd As New MySqlCommand(Query, cnn)
rdr = cmd.ExecuteReader
While rdr.Read
    Me.HR_txtHaberes.Text = rdr.Item("ImporteHaberes").ToString
    Me.HR_txtDescuentos.Text = rdr.Item("ImporteDescuentos").ToString
    Me.HR_txtTotal.Text = rdr.Item("ImporteTotal").ToString
End While
cnn.Close()

我必须在文本框中显示每个查询的结果。

现在VB给我错误“无法在结果中找到指定的列”

mysql vb.net navicat
1个回答
0
投票

让我们开始将您的查询更改为参数化查询。您的老师告诉您,在您当前的情况下这并不重要,但我强烈不同意。编写参数化查询是您需要尽快学习的一项技能。从安全性考虑的一部分来看,现在没有所有这些串联的情况,它有多清晰。

Dim Query As String = "
    SELECT SUM(importe) as ImporteHaberes 
    FROM personal_haberes 
    WHERE persona_doc  = @doc AND mes = @mes AND año = @ano;
    SELECT SUM(importe) as ImporteDescuentos 
    FROM personal_descuentos 
    WHERE persona_doc = @doc AND mes = @mes AND año = @ano;
    SELECT  (SELECT SUM(importe) 
        FROM personal_haberes 
        WHERE persona_doc = @doc AND mes = @mes AND año = @ano) -
            (SELECT SUM(importe) 
        FROM personal_descuentos 
        WHERE persona_doc = @doc AND mes = @mes AND año = @ano) AS ImporteTotal"

现在创建命令并添加三个参数再次查看它如何更简洁明了,并且很容易通过Value.Month找出问题所在。最后一个参数也重复一次。

Dim cmd As New MySqlCommand(Query, cnn)
cmd.Parameters.Add("@doc", MySqlDbType.VarChar).Value = Module1.document
cmd.Parameters.Add("@mes", MySqlDbType.Int32).Value = HR_DatePicker.Value.Month
' ???? This should be HR_DatePicker.Value.Year ???? '
cmd.Parameters.Add("@ano", MySqlDbType.Int32).Value = HR_DatePicker.Value.Month
rdr = cmd.ExecuteReader

现在使用NextResult。只需开始第一个循环即可获得第一个结果,然后传递给第二个结果,依此类推]

While rdr.Read()
    Me.HR_txtHaberes.Text = rdr.Item("ImporteHaberes").ToString
End While    
rdr.NextResult() 

While rdr.Read()
    Me.HR_txtDescuentos.Text = rdr.Item("ImporteDescuentos").ToString
End While
rdr.NextResult() 
While rdr.Read()
    Me.HR_txtTotal.Text = rdr.Item("ImporteTotal").ToString
End While

鉴于您的返回始终是每个查询的一条记录,因此您也可以用简单的While循环替换While循环>

If rdr.Read() Then
    Me.HR_txtHaberes.Text = rdr.Item("ImporteHaberes").ToString
End If
rdr.NextResult() 
..... 
© www.soinside.com 2019 - 2024. All rights reserved.