与关系 vb.net 计数表

Posted

技术标签:

【中文标题】与关系 vb.net 计数表【英文标题】:count table with relationship vb.net 【发布时间】:2019-03-21 12:06:27 【问题描述】:

我有 2 个数据库表,即办公室和状态。状态包括有缺陷、缺少部件和丢失。我想要发生的事情是,每当我选择一个办公室时,该办公室的有缺陷、丢失的部件和丢失的物品都会被统计并显示在文本框或标签中。

截图:

sqlconnection.Open() 
Dim cmd As New mysqlCommand("Select Count(*) from cpfrtsdata where office = '" & ComboBox1.Text & "' ", sqlconnection) 
Dim i As Integer = cmd.ExecuteScalar() 
cmd = Nothing 
sqlconnection.Close() 
Label3.Text = i 

【问题讨论】:

还不完全清楚。你需要帮助做计数逻辑还是显示逻辑?您已经告诉我们您想要发生的事情,但没有告诉我们您遇到的问题,或者向我们提供了不符合预期的代码。 sqlconnection.Open() Dim cmd As New MySqlCommand("Select Count(*) from cpfrtsdata where office = '" & ComboBox1.Text & "'", sqlconnection) Dim i As Integer = cmd. ExecuteScalar() cmd = Nothing sqlconnection.Close() Label3.Text = 我有这段代码,但这只会显示每个办公室的总物品,而不是每个有缺陷、缺失的部件或丢失的物品 【参考方案1】:

Select Count(*) from cpfrtsdata where office = 'Carpentry Shop' 将返回办公室等于Carpentry Shop 的记录数。为了得到每个status的总数,您需要多次发出SQL事务,如下所示:

Select Count(*) from cpfrtsdata where office = 'Carpentry Shop' and status = 'Defective'
Select Count(*) from cpfrtsdata where office = 'Carpentry Shop' and status = 'Lost'

等等。或者您可以修改您的 SQL 以在一个事务中检索所有内容:

Select 
    sum(case status when 'Defective' then 1 else 0 end) as TotalDefective,
    sum(case status when 'Lost' then 1 else 0 end) as TotalLost,
    sum(case status when 'Missing Parts' then 1 else 0 end) as TotalMissingParts
from cpfrtsdata
where office = 'Carpentry Shop'
group by office

由于该查询返回的是表,所以需要使用MySqlDataAdaptercmd.ExecuteReader

【讨论】:

非常好!我在 SSMS 中玩了一会儿才弄明白。在 SQL Server 中,我不需要 group by。绝对是赞成票。 如果您需要查找特定办公室的总数,则不需要 group by 子句。但如果您需要检索结果集中每个办公室的总计,则需要 group by。 ("Select Count(*) from cpfrtsdata where office = '" & ComboBox1.Text & "' and status = 'Defective'", sqlconnection) 这就是我所做的,只要用户选择另一个办公室,系统将只计算所选办公室中的缺陷品。谢谢你的想法。【参考方案2】:

我要检查的第一件事是验证您是否从组合框中返回了一个值。逐步调试调试器并验证预期值。然后检查以确保您从查询中获得了一个值。给你的控件起一个比 ComboBox1 和 Label3 更好的名字,使用默认名字很容易使用错误的控件。

我会从使用 text 属性切换到 SelectedItem 以从控件中取回值。

MS Docs 谈到组合框:

您可以使用这些属性来管理当前选中的项目 列表中,Text 属性指定显示在 编辑字段,SelectedIndex 属性获取或设置当前 item 和 SelectedItem 属性以获取或设置对 对象。

Dim officeString As String = ComboBox1.SelectedItem.ToString()

另外,您需要在查询中使用参数来防止 SQL 注入攻击

【讨论】:

以上是关于与关系 vb.net 计数表的主要内容,如果未能解决你的问题,请参考以下文章

通过计数与组进行 Linq

加入的 Laravel 查询生成器计数

两个表之间的猪拉丁计数差异

如何从 VB.NET 中的 XML 文件构建唯一的树结构

Laravel:如何编写关于 belongsToMany 关系的连接计数查询?

Laravel 5.2 orderBy与ofCount的关系导致SQL错误,因为尝试获取列而不是计数失败