C# 我能把这个if语句浓缩一下吗?
基本上,这段代码的目的是根据是否应用了某些过滤器来显示一些信息。然而,在我当前的方法中,每当我应用一个新的过滤器时,if语句的数量都呈指数增长。我担心我的代码很快会变得缓慢,难以管理,因为我应用了更多的过滤器。有没有更好的方法来达到同样的结果?在担心一些C# 我能把这个if语句浓缩一下吗?,c#,sql,C#,Sql,基本上,这段代码的目的是根据是否应用了某些过滤器来显示一些信息。然而,在我当前的方法中,每当我应用一个新的过滤器时,if语句的数量都呈指数增长。我担心我的代码很快会变得缓慢,难以管理,因为我应用了更多的过滤器。有没有更好的方法来达到同样的结果?在担心一些if语句之前,您的代码有很多更大的问题需要担心。我将解决所有这些问题,你将开始看到解决它们,将解决你的混乱 首先,所有查询中的SQL查询文本基本相同: if (allStatusCheckBox.Checked != true) { if (
if
语句之前,您的代码有很多更大的问题需要担心。我将解决所有这些问题,你将开始看到解决它们,将解决你的混乱
首先,所有查询中的SQL查询文本基本相同:
if (allStatusCheckBox.Checked != true)
{
if (assComboBox.SelectedIndex != -1 && revComboBox.SelectedIndex != -1)
{
dataSda = new SqlDataAdapter("SELECT DATAACTUALID WHERE ASSIGNEDSTATUS LIKE '" + statusComboBox.SelectedValue + "' AND A_ASSIGNEDTO.EMP_ID LIKE '" + assComboBox.SelectedValue + "%' AND A_TOBEREVIEWEDBY.EMP_ID LIKE '" + revComboBox.SelectedValue + "%'", patientCon);
}
else if (assComboBox.SelectedIndex != -1 && revComboBox.SelectedIndex == -1)
{
dataSda = new SqlDataAdapter("SELECT DATAACTUALID WHERE ASSIGNEDSTATUS LIKE '" + statusComboBox.SelectedValue + "' AND A_ASSIGNEDTO.EMP_ID LIKE '" + assComboBox.SelectedValue + "%'", patientCon);
}
else if (assComboBox.SelectedIndex == -1 && revComboBox.SelectedIndex != -1)
{
dataSda = new SqlDataAdapter("SELECT DATAACTUALID WHERE ASSIGNEDSTATUS LIKE '" + statusComboBox.SelectedValue + "' AND A_TOBEREVIEWEDBY.EMP_ID LIKE '" + revComboBox.SelectedValue + "%'", patientCon);
}
else
{
dataSda = new SqlDataAdapter("SELECT DATAACTUALID WHERE ASSIGNEDSTATUS LIKE '" + statusComboBox.SelectedValue + "'", patientCon);
}
}
else
{
//REPEAT WITHOUT STATUSCOMBOX.SELECTED VALUE
}
看到所有这些连接和特定的选择/别名了吗?这是一个创建SQL视图的绝佳机会,然后您可以查询新创建的视图,而不是不断重复执行相同的精确查询
假设您将视图命名为v_SomeView
,所有查询如下所示:
SELECT
DATAACTUALID,
A_DATAACTUAL.TRIGGERPOINTSID,
TBLPT.PT_ID,
NAME as C,
A_ASSIGNEDTO.EMP_ID as ASSIGNEDID,
A_TOBEREVIEWEDBY.EMP_ID as REVIEWERID,
TBLPT.LASTNAME + ' ' + TBLPT.FIRSTNAME as Patient,
TRIGGERNAME as DESCRIPTION,
TRIGGERPOINTNAME as DETAIL,
A_ASSIGNEDTO.EMP_LASTNAME + ' ' + A_ASSIGNEDTO.EMP_FIRSTNAME as Assigned,
TODOBY, A_TOBEREVIEWEDBY.EMP_LASTNAME + ' ' + A_TOBEREVIEWEDBY.EMP_FIRSTNAME as Reviewer,
REVIEWDATE,
GRADE,
COMMENT
FROM A_DATAACTUAL
INNER JOIN TBLPT ON A_DATAACTUAL.PT_ID = TBLPT.PT_ID
INNER JOIN A_TRIGGERPOINTS ON A_DATAACTUAL.TRIGGERPOINTSID = A_TRIGGERPOINTS.TRIGGERPOINTSID
INNER JOIN A_TRIGGERS ON A_TRIGGERPOINTS.TRIGGERID = A_TRIGGERS.TRIGGERID
INNER JOIN A_ASSIGNEDTO ON A_DATAACTUAL.ASSIGNEDTO = A_ASSIGNEDTO.EMP_ID
INNER JOIN A_TOBEREVIEWEDBY ON A_DATAACTUAL.TOBEREVIEWEDBY = A_TOBEREVIEWEDBY.EMP_ID
INNER JOIN A_STATUS ON A_DATAACTUAL.ASSIGNEDSTATUS = A_STATUS.STATUSID
使用SQL的强大功能,C#应该只负责这么多
第二个大问题是您有SQL注入漏洞。您应该永远不要像这样连接SQL查询始终使用参数
如果必须使用SqlDataAdapter
,请举一个快速示例:
"SELECT * FROM v_SomeView WHERE A_ASSIGNEDTO.EMP_ID LIKE ..."
"SELECT * FROM v_SomeView WHERE A_TOBEREVIEWEDBY.EMP_ID LIKE ..."
通过这两个更改,您使代码更加安全,保持了代码的干燥,并利用了SQL的强大功能 您的C#代码/查询代码无法远程读取。我建议只显示足够多的if分支,以便理解要点。请包装这些查询,使它们在不滚动的情况下完全可见。我担心我的代码很快会变慢,因为if语句无法加速。这段代码不会成为性能瓶颈首先,您有很多重复的代码。其次,您有明显的SQL注入漏洞。我会先解决这两个问题,我敢打赌你会在过程中发现你的实际问题得到了回答;与往返数据库服务器相比,一些
if
s的性能是无关紧要的。我现在正在学习这些课程,这很好。因此,据我所知,在不使用参数的情况下,有人可能会输入一个字符串来修改我的sql语句,从而允许他们插入或修改记录或其他一些内容。对于参数,语句将只将该输入视为要搜索的值。我仍然不能完全理解参数是如何阻止注入的,但我想这并不重要。@Person你所理解的是正确的,关于为什么可以找到一个很好的堆栈溢出问题,详细说明参数为什么以这种方式工作。好的,我想我现在完全理解了。参数防止通过使用以下字符转义select语句:;然后编写自己的sql语句。相反,参数将这些字符视为参数的一部分。谢谢你的帮助。
dataSda = new SqlDataAdapter("SELECT * FROM v_SomeView WHERE ASSIGNEDSTATUS = @someValue", patientCon);
dataSda.SelectCommand.Parameters.Add(new SqlParameter("@someValue", assComboBox.SelectedValue));