2015-04-14 4 views
-5

Я запускаю цикл, где я просматриваю записи в базе данных. Каждый раз, когда цикл работает, я сравниваю ответ пользователя со значением в моей базе данных. Строки таблицы называются answer2, answer3 ... и т. Д. Итак, я конкатенирую строку: («answer» + (i)) и использую строку с базой данных database.queryValue (string), чтобы поместить значение из базы данных в переменную. (в этом случае переменная cAltAnsX)loop возвращает, несмотря на разрыв

В конце концов цикл возвращает нулевое значение. Я хочу, чтобы мой цикл завершился до его повторного запуска. Я пытаюсь загрузить запрошенное значение в объект, а затем сравниваю его с DBNull.Value, затем попытаюсь выйти из цикла с break; Однако я все еще сравниваю 2 строки. то есть uAns.ToLower() == cAns.ToLower(). Мой код возвращает ошибку, поскольку он не может преобразовать значение Null в строку. Я хотел бы выйти из этих циклов, как только запрос загрузит нулевое значение (и до того, как скрипт попытается преобразовать его в строку).

Я попытался использовать break и вернуться, чтобы закончить строку, но я все равно получаю ту же проблему.

if (!Request.QueryString["uAnswer"].IsEmpty()) 
{ 
uAns = Request.QueryString["uAnswer"]; 

if (uAns.ToLower() == cAns.ToLower()) 
     { 
      anBool = true; 
     } 
     else    //Should cycle through all answers in alternativeAnswers table 
     { 
      for (var i = 0; i < 30; i++) 

       { 


           if (uAns.ToLower() == cAltAnsX.ToLower()) 
            { 
             anBool = true; 
            } 
            else 
            { 
             altAnsXCom = altAnsXCom+1; 
             string x = altAnsXCom.ToString(); 
             AltCommandTemp = string.Concat(altAns1Com, x, altAns2Com, sQTerm); 
             cAltAnsX = db.QueryValue(AltCommandTemp); 
             objcAA = db.Query(AltCommandTemp); 

             if (objcAA == DBNull.Value) {break;} 
             if (cAltAnsX == null) {break;} 
            } 

        } 
      if (anBool != true) 
       { 
      anBool = false; 
       } 
     } 
+7

Я не вижу петлю. Я что-то упускаю? –

+0

Отсутствует сама петля. Это похоже на содержимое цикла как «в настоящее время». – StarPilot

+0

Ваши переменные действительно должны быть названы лучше. Трудно следить за тем, что происходит в вашем коде. –

ответ

0

Если это внутри функции, вы уверены, что не хотите return вместо break?


Перерыв только выйдет из вашей текущей сферы действия. Если у вас есть гнездовая петля/коммутатор, выйдет только из самой внутренней секции.

Я предлагаю разбить вашу логику на отдельную функцию или лямбду, чтобы вы могли просто коротко замыкаться return.


Кроме того, похоже, что вы можете делать конкатенации для запросов к базе данных, которая все вокруг плохая форма, в отличие от параметра запросов на основе.

+0

Кажется, что он имеет вложенные операторы if, но не вложенные для циклов (мы не можем знать без полного кода). break не зависит от вложенных операторов if, которые, как мне кажется, важно упомянуть. –

0

Вы говорите, что «программа по-прежнему падает, поскольку она по-прежнему сравнивает значение« Нуль »со строкой в ​​верхней части скрипта». Я предполагаю, что это означает, что из-за того, что cAltAnsX имеет значение null, и вы пытаетесь вызвать cAltAnsX.ToLower()?

В коде вы только разорвете, если objcAA равно null. Я думаю, вам нужно также проверить, является ли cAltAnsX нулевым.

if (uAns.ToLower() == cAltAnsX.ToLower()) 
{ 
    anBool = true; 
} 
else // this reloads the query before subsequent comparison 
{ 
    ... 
    cAltAnsX = db.QueryValue(AltCommandTemp); 
    objcAA = db.Query(AltCommandTemp); 
    if (objcAA == DBNull.Value) {break;} 
    if (cAltAnsX == null) {break;} 
} 
0

Так что я нашел ответ. Часть проблемы заключается в том, что мне нужно использовать

(cAltAnsX.Equals(null)) 

или

(DBNull.Value.Equals(objcAA)) 

Вместо того

(string == null) or (object == DBNull.Value) 

Если кто-нибудь может просветить меня о разнице между этими двумя стратегиями я был бы признателен , Затем я столкнулся с проблемой, поставив эти условия в цикл if. I.e.

if (!DBNull.Value.Equals(objcAA)) 
{ 
    //do stuff 
} 
Смежные вопросы