Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我能把这个if语句浓缩一下吗?_C#_Sql - Fatal编程技术网

C# 我能把这个if语句浓缩一下吗?

C# 我能把这个if语句浓缩一下吗?,c#,sql,C#,Sql,基本上,这段代码的目的是根据是否应用了某些过滤器来显示一些信息。然而,在我当前的方法中,每当我应用一个新的过滤器时,if语句的数量都呈指数增长。我担心我的代码很快会变得缓慢,难以管理,因为我应用了更多的过滤器。有没有更好的方法来达到同样的结果?在担心一些if语句之前,您的代码有很多更大的问题需要担心。我将解决所有这些问题,你将开始看到解决它们,将解决你的混乱 首先,所有查询中的SQL查询文本基本相同: if (allStatusCheckBox.Checked != true) { if (

基本上,这段代码的目的是根据是否应用了某些过滤器来显示一些信息。然而,在我当前的方法中,每当我应用一个新的过滤器时,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));