解决方案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
Solutin 2:
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
哪一个在性能和执行速度方面是更好的解决方案?
UPDATE:我将数据存储到DATATABLE ....然后将其与ListView一起使用。
答案 0 :(得分:2)
有没有理由不使用“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”,那就行了。 “不要重复自己,”是的,是的,你可以打赌。
答案 1 :(得分:1)
编写软件的一个原则是:不要重复自己(DRY)。所以解决方案1肯定更好。否则,您将遇到代码维护问题。我怀疑你会在两种解决方案之间获得任何可测量的速度差异。
答案 2 :(得分:1)
Which one is a better solution in terms of performance and speed of execution??
好吧,抛开关于字符串连接的担忧,最好的方法是获得对数据库的最小调用次数所需的所有数据。
您应该更改代码以确定需要哪些学期,然后将所有内容放在一个独特的查询中
所以,正如你所说,在你的评论中,(Semester=1 OR Semester=2 OR Semester=3")
会更好。
从您的代码中,我假设semester
是一个varchar字段。这很糟糕,因为如果它是一个数字,你可以使用最小值和最大值编写更好的查询。 (如果你可以保证学期是连续的顺序。) (Semester >= 1 AND Semester <= 3)
但是,您可以获得的最佳性能是,在数据表中是否具有正确的索引。