【发布时间】:2018-07-06 13:48:05
【问题描述】:
我的代码正在运行,但我认为还有另一种方法可以仅使用 sql。我正在考虑将这段代码简化为更简单。请帮忙 代码获取库存表的总和,然后从相同大米名称的事务表中减去,然后显示结果。但如果第二个查询为空,则显示第一个查询的结果,而无需从第二个查询中减去。
Dim commnd2 As New SqlCommand("SELECT RICETYPE.RICENAME, Sum(STOCK.NUMBEROFSTOCKS) AS SumOfNUMBEROFSTOCKS FROM SUPPLIER INNER JOIN (RICETYPE INNER JOIN STOCK ON RICETYPE.ID = STOCK.RICETYPEID) ON SUPPLIER.ID = STOCK.SUPPLIER GROUP BY RICETYPE.RICENAME", cn)
dr = commnd2.ExecuteReader()
If dr.HasRows Then
While dr.Read
Dim commnd3 As New SqlCommand("SELECT RICETYPE.RICENAME, Sum(TRANSAC.NUMBEROFSALES) AS SumOfNUMBEROFSALES
FROM RICETYPE INNER JOIN TRANSAC ON RICETYPE.ID = TRANSAC.RICETYPEID WHERE RICETYPE.RICENAME = '" & dr.Item(0) & "'
GROUP BY RICETYPE.RICENAME
", cn)
dr2 = commnd3.ExecuteReader()
If dr2.HasRows Then
While dr2.Read
dt.Rows.Add(dr2.GetValue(0), dr.GetValue(1) - dr2.GetValue(1), dr2.GetValue(1))
End While
Else
dt.Rows.Add(dr.GetValue(0), dr.GetValue(1), 0)
End If
End While
End If
【问题讨论】:
-
开始使用
Option Strict,没有理由使用Off。通常这不会编译,因为您在dr.GetValue(1) - dr2.GetValue(1)处相互减去对象。使用dr.GetInt32(1) - dr2.GetInt32(1) -
用您正在使用的数据库标记您的问题。
-
旁注 - 始终使用参数化 sql 并避免字符串连接向 sql 语句添加值。见How can I add user-supplied input to an SQL statement?
-
你标记了ssms-2017,如果这是Sql Server,你为什么要使用OleDb 类型(如
OleDbCommand)而不是Sql 类型(如SqlCommand)?还有一个更合适的标签是sql-server,因为您没有直接在您发布的问题中对 SSMS 做任何事情。 -
忘记更改为 SqlCommand。我已经更改了我的代码。我忘了为这篇文章编辑我的代码
标签: sql sql-server vb.net sum