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(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 に答える