为啥按 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 中很好?的主要内容,如果未能解决你的问题,请参考以下文章