C# 哪一个是更好的解决方案?

C# 哪一个是更好的解决方案?,c#,asp.net,vb.net,C#,Asp.net,Vb.net,解决方案1: Dim i As Integer = CInt(_table.Rows(0).Item(3)) Do While i - 2 > 0 _tableBackLogs.Merge(Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session(

解决方案1:

Dim i As Integer = CInt(_table.Rows(0).Item(3))
Do While i - 2 > 0
                _tableBackLogs.Merge(Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & "' AND Status='Fail' AND Semester='" & i - 2 & "'"))
                i = i - 2
            Loop
 If i = 1 Then
                Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & "' AND Status='Fail' AND Semester='" & i & "'")
            ElseIf i = 2 Then
                Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & "' AND Status='Fail' AND Semester='" & i - 2 & "'")
            ElseIf i = 3 Then
                Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & "' AND Status='Fail' AND Semester='" & i - 2 & "'")
                'On and on....upto i=8
            End If
溶媒2:

Dim i As Integer = CInt(_table.Rows(0).Item(3))
Do While i - 2 > 0
                _tableBackLogs.Merge(Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & "' AND Status='Fail' AND Semester='" & i - 2 & "'"))
                i = i - 2
            Loop
 If i = 1 Then
                Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & "' AND Status='Fail' AND Semester='" & i & "'")
            ElseIf i = 2 Then
                Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & "' AND Status='Fail' AND Semester='" & i - 2 & "'")
            ElseIf i = 3 Then
                Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & "' AND Status='Fail' AND Semester='" & i - 2 & "'")
                'On and on....upto i=8
            End If
在性能和执行速度方面,哪种解决方案更好


更新:我正在将数据存储到数据表中……然后将其与列表视图一起使用。

编写软件的一个原则是:不要重复自己的操作(干)。因此,解决方案1肯定更好。否则,您将遇到代码维护问题。我怀疑这两种解决方案之间是否会有任何可测量的速度差异。

编写软件的一个原则是:不要重复(干)。因此,解决方案1肯定更好。否则,您将遇到代码维护问题。我怀疑这两种解决方案之间是否存在任何可测量的速度差异

Which one is a better solution in terms of performance and speed of execution??
好吧,抛开对字符串连接的担忧不谈,最好的方法是在对数据库的最小调用次数内获得所需的所有数据

您应该更改代码以确定需要哪些学期,然后将所有内容放在一个唯一的查询中。
所以,正如你所说,在你的评论中,
(学期=1或学期=2或学期=3”)
会更好

根据您的代码,我假设
学期
是一个varchar字段。这很糟糕,因为如果它是一个数字,您可以使用最小值和最大值编写更好的查询。(另外,如果您可以确保学期顺序是连续的。)。
(学期>=1和学期
好吧,抛开对字符串连接的担忧不谈,最好的方法是在对数据库的最小调用次数内获得所需的所有数据

您应该更改代码以确定需要哪些学期,然后将所有内容放在一个唯一的查询中。
所以,正如你所说,在你的评论中,
(学期=1或学期=2或学期=3”)
会更好


从您的代码中,我假设
学期
是一个varchar字段。这很糟糕,因为如果它是一个数字,您可以使用最小值和最大值编写更好的查询。(如果您可以确保学期是连续的。)。
(学期>=1和学期有什么理由不使用“in”吗在一个查询中获取所有这些学期数字,比如在这样的查询中

Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade 
    FROM SubjectPI 
    WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & 
           "' AND Status='Fail' 
              AND Semester IN ('8', '6', '4', '2'))");

因为如果你能用“IN”,那么就用“不要重复你自己”,是的,当然可以,没错。

有什么理由不使用“IN”在一个查询中获取所有这些学期的数字,比如在这样的查询中

Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade 
    FROM SubjectPI 
    WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & 
           "' AND Status='Fail' 
              AND Semester IN ('8', '6', '4', '2'))");

因为如果你能用“IN”,就要用。“不要重复你自己,”是的,当然,是的,没错。

Global.DataAccess。
GetDataTable
是一个返回
DataTable
的函数,这两个解决方案是不可比的。在第一个解决方案中,你得到的记录数量不精确,并将它们重复地合并在一起(超过一个学期)。在第二个学期中,您只会得到指定学期的记录(但i值有点奇怪)。顺便说一句,这与问题无关,但代码受Sql约束Injection@Steve好的,谢谢……但是如果第二个解决方案是这样的`
Global.DataAccess.GetDataTable(“从SubjectPI中选择SubjectID、SubjectName、年级,其中RegNo=”&CInt(HttpContext.Current.Session(“用户名”)&“,”状态为“不及格”,以及(学期=1或学期=2或学期=3”)
`在这里,我试图收集三个学期的数据……sql命令可能是错误的,但我希望您能理解我试图解释的内容……这个解决方案呢??Global.DataAccess。
GetDataTable
是一个返回
DataTable
的函数,这两个解决方案不可比较。在第一个解决方案中,您得到的是不精确的记录的数量,并将它们重复地合并在一起(超过一个学期)。在第二个学期中,您只获得指定学期的记录(但i值有点奇怪).顺便说一句,这与问题无关,但代码受Sql约束Injection@Steve好的,谢谢……但是如果第二个解决方案是这样的`
Global.DataAccess.GetDataTable(“从SubjectPI中选择SubjectID、SubjectName、Grade,其中RegNo=””)&CInt(HttpContext.Current.Session(“userName”)&“和Status='Fail'和(学期=1或学期=2或学期=3)
`我在这里试图收集三个学期的数据…sql命令可能是错误的,但我希望您能够理解我试图解释的内容…这个解决方案呢?谢谢您的快速回复:)谢谢您的快速回复:)嘿,Steve…很抱歉回复太晚了。
学期
是一个
整数
字段。.我使用
do while
循环来做这件事,因为如果将来我必须更改某些内容…我将不得不使用
if END if
路径来更改许多语句。。我同意
最好的方法是获取所有数据我接受你的回答。嘿,史蒂夫…很抱歉回复太晚。
学期
是一个
整数
字段。我使用
do while
循环来做这件事,因为如果将来我必须更改某些内容…我将不得不用
if来更改许多语句如果
path,则结束。我同意,
最好的方法是以最少的数据库调用次数获取所需的所有数据
我接受您的回答。因为
i
的值不是固定的…
i
会随着不同的条件而变化。这不会阻止您使用“in”。您已经在用子字符串构建查询。请创建一个为“IN”生成正确字符串的函数,并将其用作查询构建的一部分。因为
i
的值不是固定的…
i
会随着不同的条件而变化。这不会阻止您使用“IN”您已经在用子字符串构建查询。请创建一个为“IN”生成正确字符串的函数,并将其用作查询构建的一部分。