1

我想检查用户是否有效。它给了我异常,当用户有效时,它可以正常工作,但是如果用户无效,则会出现一些问题。

例外是:位置 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;
}

然后我在这里打电话给那个人。

                if (!CheckUserExistAndReporter(user))
                {
                    ErrorLog(messageIn);
                    msgOut = "ugyldig Bruker";//Invalid User.

                }

错误是什么?

4

7 回答 7

6

阅读完所有答案后,我认为这个比其他答案更好,请在您的代码中添加以下 If。

if(uds != null && uds.Tables.Count > 0 && uds.Tables[0].Rows.Count>0)
于 2012-10-19T04:58:42.963 回答
4

您的方法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"]);
于 2012-10-19T04:55:06.047 回答
3
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 );
于 2012-10-19T04:53:10.140 回答
2

在访问 row[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;  
}   
于 2012-10-19T04:54:47.450 回答
2

你可以这样做

if(uds.Tables[0].Rows.Count>0)
{
  reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]);
}
于 2012-10-19T04:55:05.910 回答
2

我认为问题出在这条线上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"]); 
    ...
于 2012-10-19T04:55:22.433 回答
2

首先找出天气数据集是否包含任何记录,然后继续

if (uds.Tables[0].Rows.Count > 0)
    {
    // retrieve id and return it
    }
    else
    {
    return something which indicates record not found
    }
于 2012-10-19T04:57:01.303 回答