我正在运行循环,循环访问数据库中的条目。每次循环运行时,我都会将用户的答案与数据库中的值进行比较。表行名为answer2,answer3 ...等所以我连接一个字符串:(“answer”+(i))并使用带有database.queryValue(string)的字符串将数据库中的值放入变量中。 (在本例中为变量cAltAnsX)
最终循环返回一个空值。我希望我的循环在它再次运行之前终止。我尝试将查询的值加载到对象中,然后将其与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;
}
}
答案 0 :(得分:0)
如果这是在函数内部,您确定不想return
而不是break
吗?
休息只会超出你当前的范围。如果你有一个嵌套的循环/开关案例,只会突破最里面的部分。
我建议将你的逻辑分解为一个单独的函数或lambda,你可以简单地将return
缩短。
此外,看起来您可能正在进行字符串连接以查询数据库,这是一种全面的错误形式,而不是基于参数的查询。
答案 1 :(得分:0)
你说“程序仍然崩溃,因为它仍然将Null值与脚本顶部的字符串进行比较。”我认为这意味着这是因为cAltAnsX为null并且您正在尝试调用cAltAnsX.ToLower()?
在代码中,只有在objcAA为空时才会中断。我想你还需要检查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;}
}
答案 2 :(得分:0)
所以我找到了答案。部分问题是我需要使用
(cAltAnsX.Equals(null))
或
(DBNull.Value.Equals(objcAA))
而不是
(string == null) or (object == DBNull.Value)
如果有人可以就这两种策略之间的差异教育我,我将不胜感激。 然后我通过将这些条件放在if循环中来解决问题。 即。
if (!DBNull.Value.Equals(objcAA))
{
//do stuff
}