如何在 VB.net 中使用多个结果
how to use multiple results in VB.net
我需要在 3 个文本框中显示同一语句中 3 个查询的结果。
我在 mysql 中有两个表,分别是 personal_sueldos
和 personal_haberes
。
它们都有相同的列。我需要 select 来自两个查询的相同信息,第三个查询是从 haberes
.
中减去 descuentos
所以我必须以 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 给我错误 "Could not find specified column in results"
让我们开始将您的查询更改为参数化查询。你的老师告诉你,这在你目前的情况下并不重要,但我坚决不同意。编写参数化查询是一项您需要尽快学习的技能。出于安全考虑的一部分,看看现在没有所有这些连接的清晰度。
Dim Query As String = "
SELECT SUM(importe) as ImporteHaberes
FROM personal_haberes
WHERE persona_doc = @doc AND mes = @mes AND año = @año;
SELECT SUM(importe) as ImporteDescuentos
FROM personal_descuentos
WHERE persona_doc = @doc AND mes = @mes AND año = @año;
SELECT (SELECT SUM(importe)
FROM personal_haberes
WHERE persona_doc = @doc AND mes = @mes AND año = @año) -
(SELECT SUM(importe)
FROM personal_descuentos
WHERE persona_doc = @doc AND mes = @mes AND año = @año) 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("@año", 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
鉴于您的 return 始终是每个查询的单个记录,那么您也可以用简单的
替换 While 循环
If rdr.Read() Then
Me.HR_txtHaberes.Text = rdr.Item("ImporteHaberes").ToString
End If
rdr.NextResult()
.....
这里有很多需要清理。 从不 可以使用字符串连接来构建这样的查询,即使在学习代码 时也是如此。这也不是管理连接对象的正确方法。
更好的模式(有固定的代码,包括下一个结果问题),看起来像这样:
'Multi-line string literals are now supported
' Note: there is NO CONCATENATION here. This is a constant.
' I also consolidated the SQL to avoid worrying about separate result sets.
Dim Query As String = "
SELECT SUM(importe) as Importe
FROM personal_haberes
WHERE persona_doc = @document AND mes = @mes AND año = @ano
UNION ALL
SELECT SUM(importe)
FROM personal_descuentos
WHERE persona_doc = @document AND mes = @mes AND año = @ano;"
Using cnn As New MySqlConnection("connection string here"), _
cmd As New MySqlCommand(query, cnn)
'Guessing at types/lengths here.
' Use the ACTUAL columns types and lengths from your database
cmd.Parameters.Add("@document", MySqlDbType.VarChar, 50).Value = Module1.document
cmd.Parameters.Add("@mes", MySqlDbType.Int32).Value = HR_DatePicker.Value.Month
cmd.Parameters.Add("@ano", MySqlDbType.Int32).Value = HR_DatePicker.Value.Year 'This was your error
'Wait as long as possible to call .Open()
cnn.Open()
Using rdr As MySqlDataReader = cmd.ExecuteReader()
rdr.Read()
Dim Haberes As Integer = CInt(rdr("Importe"))
rdr.Read()
Dim Descuentos As Integer = CInt(rdr("Importe"))
Me.HR_txtHaberes.Text = Haberes.ToString()
Me.HR_txtDescuentos.Text = Descuentos.ToString()
Me.HR_txtTotal.Text = (Haberes - Descuentos).ToString() 'No need to make the database do the subtraction work.
End Using
End Using ' This will take care of closing the connection.. even if an exception is thrown!
'The old code might have leaked open connections whenever there was an exception.
我需要在 3 个文本框中显示同一语句中 3 个查询的结果。
我在 mysql 中有两个表,分别是 personal_sueldos
和 personal_haberes
。
它们都有相同的列。我需要 select 来自两个查询的相同信息,第三个查询是从 haberes
.
中减去 descuentos
所以我必须以 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 给我错误 "Could not find specified column in results"
让我们开始将您的查询更改为参数化查询。你的老师告诉你,这在你目前的情况下并不重要,但我坚决不同意。编写参数化查询是一项您需要尽快学习的技能。出于安全考虑的一部分,看看现在没有所有这些连接的清晰度。
Dim Query As String = "
SELECT SUM(importe) as ImporteHaberes
FROM personal_haberes
WHERE persona_doc = @doc AND mes = @mes AND año = @año;
SELECT SUM(importe) as ImporteDescuentos
FROM personal_descuentos
WHERE persona_doc = @doc AND mes = @mes AND año = @año;
SELECT (SELECT SUM(importe)
FROM personal_haberes
WHERE persona_doc = @doc AND mes = @mes AND año = @año) -
(SELECT SUM(importe)
FROM personal_descuentos
WHERE persona_doc = @doc AND mes = @mes AND año = @año) 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("@año", 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
鉴于您的 return 始终是每个查询的单个记录,那么您也可以用简单的
替换 While 循环If rdr.Read() Then
Me.HR_txtHaberes.Text = rdr.Item("ImporteHaberes").ToString
End If
rdr.NextResult()
.....
这里有很多需要清理。 从不 可以使用字符串连接来构建这样的查询,即使在学习代码 时也是如此。这也不是管理连接对象的正确方法。
更好的模式(有固定的代码,包括下一个结果问题),看起来像这样:
'Multi-line string literals are now supported
' Note: there is NO CONCATENATION here. This is a constant.
' I also consolidated the SQL to avoid worrying about separate result sets.
Dim Query As String = "
SELECT SUM(importe) as Importe
FROM personal_haberes
WHERE persona_doc = @document AND mes = @mes AND año = @ano
UNION ALL
SELECT SUM(importe)
FROM personal_descuentos
WHERE persona_doc = @document AND mes = @mes AND año = @ano;"
Using cnn As New MySqlConnection("connection string here"), _
cmd As New MySqlCommand(query, cnn)
'Guessing at types/lengths here.
' Use the ACTUAL columns types and lengths from your database
cmd.Parameters.Add("@document", MySqlDbType.VarChar, 50).Value = Module1.document
cmd.Parameters.Add("@mes", MySqlDbType.Int32).Value = HR_DatePicker.Value.Month
cmd.Parameters.Add("@ano", MySqlDbType.Int32).Value = HR_DatePicker.Value.Year 'This was your error
'Wait as long as possible to call .Open()
cnn.Open()
Using rdr As MySqlDataReader = cmd.ExecuteReader()
rdr.Read()
Dim Haberes As Integer = CInt(rdr("Importe"))
rdr.Read()
Dim Descuentos As Integer = CInt(rdr("Importe"))
Me.HR_txtHaberes.Text = Haberes.ToString()
Me.HR_txtDescuentos.Text = Descuentos.ToString()
Me.HR_txtTotal.Text = (Haberes - Descuentos).ToString() 'No need to make the database do the subtraction work.
End Using
End Using ' This will take care of closing the connection.. even if an exception is thrown!
'The old code might have leaked open connections whenever there was an exception.