异常抛出位置0没有行

时间:2012-10-19 04:51:13

标签: c# .net c#-4.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;
}

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

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

                }

错误是什么?

7 个答案:

答案 0 :(得分:6)

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

if(uds != null && uds.Tables.Count > 0 && uds.Tables[0].Rows.Count>0)

答案 1 :(得分: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"]);

答案 2 :(得分: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 );

答案 3 :(得分:2)

在访问[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;  
}   

答案 4 :(得分:2)

你可以这样做

if(uds.Tables[0].Rows.Count>0)
{
  reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]);
}

答案 5 :(得分: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"]); 
    ...

答案 6 :(得分:2)

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

if (uds.Tables[0].Rows.Count > 0)
    {
    // retrieve id and return it
    }
    else
    {
    return something which indicates record not found
    }