2012-04-14 3 views
1

Решение 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 

Какой является лучшим решением с точки зрения производительности и скорости выполнения ??

ОБНОВЛЕНИЕ: Я храню данные в DATATABLE .... и затем используя его с ListView.

+0

Global.DataAccess.'GetDataTable' - это функция, которая возвращает 'DataTable' – user1150440

+0

. Эти два решения не сопоставимы. В первом вы получаете неточенную сумму записей и объединяете их повторно вместе (более одного семестра). Во втором вы получаете только записи за указанный семестр (но значения i немного странные). Кстати, это не связано с вопросом, но этот код подлежит Sql Injection – Steve

+0

@Steve OKay спасибо ... но если второе решение было чем-то вроде этого '' Global.DataAccess.GetDataTable («SELECT SubjectID, SubjectName, Класс FROM SubjectPI WHERE RegNo = '' & CInt (HttpContext.Current.Session ("userName")) & "'AND Status =' Fail 'AND (Семестр = 1 ИЛИ Семестр = 2 ИЛИ Семестр = 3") ' ' Здесь Я пытаюсь получить данные из трех семестров вместе ... команда sql может быть неправильной, но я надеюсь, что вы получите то, что пытаетесь объяснить ... как насчет этого решения? – user1150440

ответ

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)

Однако наилучшее качество, которое вы можете получить из этого, заключается в том, что в вашем datatable есть правильные индексы.

+0

Эй Стив ... извините за поздний ответ. '' '' '' '' '' '' Integer''. Я делаю это с использованием цикла 'do while', потому что если в будущем мне придется что-то изменить ... у меня будет изменить много операторов с помощью 'IF END IF' path..хорошо согласен, что лучший подход будет заключаться в том, чтобы получить все данные вычитается в минимальном количестве вызовов в базу данных, принимаю твой ответ. – user1150440

1

Один из принципов написания программного обеспечения: Dont Repeat Yourself (DRY). Поэтому решение 1 определенно лучше. В противном случае вы столкнетесь с проблемами обслуживания кода. Я сомневаюсь, что вы получите измеримую разницу в скорости между двумя решениями.

+0

Спасибо за быстрый ответ :) – user1150440

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", делать. «Не повторяй себя», да, конечно.

+0

, потому что значение 'i' не фиксировано ...'i' изменяется с разными условиями. – user1150440

+0

Это не мешает вам использовать «IN». Вы уже строите свой запрос из подстрок. Создайте функцию, которая генерирует правильную строку для «IN» и использует ее как часть вашего построения запросов. – mjfgates

+0

Хорошо, босс .. делаю это прямо сейчас :) Спасибо за ответ. – user1150440

Смежные вопросы