为啥按 count(lab_results.testid) desc 排序在 C# 中不起作用 - 但在 SQL Server 中很好?

Posted

技术标签:

【中文标题】为啥按 count(lab_results.testid) desc 排序在 C# 中不起作用 - 但在 SQL Server 中很好?【英文标题】:Why order by count(lab_results.testid) desc is not working in C# - but is fine in SQL Server?为什么按 count(lab_results.testid) desc 排序在 C# 中不起作用 - 但在 SQL Server 中很好? 【发布时间】:2021-11-16 03:48:23 【问题描述】:

我需要在 C# 中运行带有 ORDER BY COUNT()SELECT 语句。

SELECT 在 SQL Server 中运行良好,但在我的 C# Windows Forms 应用程序中却无法运行。

这是单击按钮时使用的代码:

private void button2_Click(object sender, EventArgs e)

    string sql = @" SELECT COUNT(lab_results.testid) as 'Test Count' , labtests.TestName  
                    FROM LabTests , lab_results 
                    WHERE labtests.testid = lab_results.testid
                      AND lab_results.approved_date IS NOT NULL ");

    string condition = "";
    string groupby = "GROUP BY labtests.testname";
    string orderby = "ORDER BY COUNT(lab_results.testid) DESC";

    DateTime fromDate;
    DateTime toDate;

    if (!DateTime.TryParse(dtFromDate.Value.ToString(), out fromDate))
    
        System.Windows.Forms.MessageBox.Show("Invalid From Date");
    
    else if (!DateTime.TryParse(dtToDate.Value.ToString(), out toDate))
    
        System.Windows.Forms.MessageBox.Show("Invalid to Date");
    
    else
    
        condition += " and cast(lab_results.approved_date as date) between '" + fromDate + "' and '" + toDate + "'";
    

    DataTable dt = data.fireDatatable(string.Format(sql + condition + groupby + orderby));

    OrdersDataGridView.DataSource = dt;
    OrdersDataGridView.Refresh();

如果代码没有排序但没有输出排序,则在 SQL Server 中 SELECT 正在工作

order by 有什么错误?我需要你的帮助。

【问题讨论】:

组合后的字符串如下所示:group by labtests.testnameorder by count(lab_results.testid) desc ...找出缺失的空格。 P.S.你应该有一个例外,而不仅仅是“没有输出”。异常应该在 SQL 中显示语法错误。你没看到吗?您是在代码中的某个地方捕获异常并将其丢弃,还是什么? 另外,您真的应该考虑使用 sql 参数,而不仅仅是将日期格式化为字符串。而且你不需要string.Format 进化!没有人应该使用old-style joins 故事的寓意:总是使用参数。如果您使用了参数,则此查询不需要字符串连接,因此存在格式错误查询的风险 【参考方案1】:

谢谢大家,我得到了你们的 cmets,现在我将 old-style-join 更改为新样式并使用 INNER JOIN 并解决了这个问题,这就是解决方案:

private void button2_Click(object sender, EventArgs e)

    string sql = @" SELECT COUNT(lab_results.testid) as 'Test Count' , labtests.TestName  
                    FROM lab_results 
                    inner join labtests on  lab_results.testid = labtests.testid
                    where lab_results.approved_date IS NOT NULL  ");

    string condition = "";
    string groupby = "  GROUP BY labtests.testname";
    string orderby = "  ORDER BY COUNT(lab_results.testid) DESC";

    DateTime fromDate;
    DateTime toDate;

    if (!DateTime.TryParse(dtFromDate.Value.ToString(), out fromDate))
    
        System.Windows.Forms.MessageBox.Show("Invalid From Date");
    
    else if (!DateTime.TryParse(dtToDate.Value.ToString(), out toDate))
    
        System.Windows.Forms.MessageBox.Show("Invalid to Date");
    
    else
    
        condition += " and cast(lab_results.approved_date as date) between '" + fromDate + "' and '" + toDate + "'";
    

    DataTable dt = data.fireDatatable(string.Format(sql + condition + groupby + orderby));

    OrdersDataGridView.DataSource = dt;
    OrdersDataGridView.Refresh();

另外,下周我将尝试其他解决方案并使用参数并以其他方式发布。

【讨论】:

以上是关于为啥按 count(lab_results.testid) desc 排序在 C# 中不起作用 - 但在 SQL Server 中很好?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 count 比 $count 差

为啥“解释”返回的行不等于count()?

为啥“解释”返回的行不等于count()?

为啥 count(false) 返回 1?

为啥变量_count总是返回-1?

为啥我应该使用 Any 方法而不是 Count? [复制]