异常抛出位置0没有行
我想检查用户是否有效,它给我例外,当用户有效时它的工作没有问题,但如果用户无效有一些问题。异常抛出位置0没有行
的例外是:没有一行位置0
这里是代码的一部分,
public bool CheckUserExistAndReporter(string user)
{
int reporterDnnId = -1;
SMSFunctionController mysms = new SMSFunctionController();
DataSet uds = mysms.GetUsersUnitByUserName(user);
reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]);
if (reporterDnnId > 0)
{
bool isValidUser = true;
return isValidUser;
}
//else
//{
//bool isValidUser =false;
//return isValidUser;
// }
return false;
}
然后我在这里呼吁thatone。
if (!CheckUserExistAndReporter(user))
{
ErrorLog(messageIn);
msgOut = "ugyldig Bruker";//Invalid User.
}
什么是错误?
您还应该在访问行[0]中的userId之前对行进行计数。
public bool CheckUserExistAndReporter(string user)
{
bool isValidUser = false;
SMSFunctionController mysms = new SMSFunctionController();
DataSet uds = mysms.GetUsersUnitByUserName(user);
if (uds != null && uds.Tables.Count > 0 && uds.Tables[0].Rows.Count>0)
{
// do further validation
var reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]);
if (reporterDnnId > 0)
{
isValidUser = true;
}
}
return isValidUser;
}
Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]);
您正在通过索引访问行。如果用户无效,则可能没有行,因此索引超出范围。
如果你所关心的是从数据库返回的记录,你可以这样做:
bool isValid = uds.Tables[0].Rows.Count > 0;
更健壮的检查将是:
bool isValid = false;
if(uds.Tables[0].Rows.Count > 0 && (int)uds.Tables[0].Rows[0]["DnnUserID"] != default(int)){
isValid = true;
}
清理了一点:
var rows = uds.Tables[0].Rows;
bool isValid = rows.Count > 0 && (int)rows[0]["DnnUserID"] != default(int);
或者,如果您需要转换(铸造更便宜,并将工作,除非值不是Int32):
var rows = uds.Tables[0].Rows;
bool isValid = rows.Count > 0 && Convert.ToInt32(rows[0]["DnnUserID"]) != default(int);
你可以像这样
if(uds.Tables[0].Rows.Count>0)
{
reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]);
}
你的方法是mysms.GetUsersUnitByUserName(user)
返回一个空表。可能没有实现选择的标准,这就是为什么当你尝试访问它时。你正在收到错误。它更好,如果你可以在访问数据行之前添加一个检查。就像是。
if(uds != null && uds.Tables.Count > 0 && uds.Tables[0].Rows.Count > 0)
reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]);
如果uds为空,您的代码将抛出空引用异常。如果uds不是null,但是uds中没有表,那么if的第二部分会抛出错误。 –
在后期你的第一部分如果还会抛出异常。索引超出限制的例外。 –
@muhammadkashif,为了安全起见,是的,应该这样做。但是OP要求排除没有行的例外。所以我的假设是他的方法是创建一个新的DataSet并返回一个空表。否则他会有一个NRE。目前他的错误是“位置0没有行”。 – Habib
我觉得问题就在这一行reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]);
。在继续处理代码之前,您必须检查if (uds.Tables[0].Rows.Count > 0)
。
if (uds.Tables[0].Rows.Count > 0)
{
reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]);
...
先找出气象数据集包含任何记录或无法再继续
if (uds.Tables[0].Rows.Count > 0)
{
// retrieve id and return it
}
else
{
return something which indicates record not found
}
阅读我觉得这是一个比别人更好所有的答案后,把下面如果你的代码。
if(uds != null && uds.Tables.Count > 0 && uds.Tables[0].Rows.Count>0)
是的。如何在用户无效时显示?它需要进入调用函数的If条件中 –
用几个示例更新了我的答案。 –
万一uds为空或uds不包含任何表的情况下,您的代码将抛出异常。 –