异常抛出位置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); 
+0

是的。如何在用户无效时显示?它需要进入调用函数的If条件中 –

+0

用几个示例更新了我的答案。 –

+0

万一uds为空或uds不包含任何表的情况下,您的代码将抛出异常。 –

你可以像这样

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"]); 
+0

如果uds为空,您的代码将抛出空引用异常。如果uds不是null,但是uds中没有表,那么if的第二部分会抛出错误。 –

+0

在后期你的第一部分如果还会抛出异常。索引超出限制的例外。 –

+0

@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)