0

私はC#で関数を持っています、これは次のとおりです:

public int checkUplinkID(string memID, string original_mem)
{
    string original_memID = original_mem;
    int retValue = 0;
    DataTable dt = new DataTable();
    using (SqlConnection mCon = new SqlConnection())
    {
        mCon.ConnectionString = ConStr;
        try
        {
            mCon.Open();
            using (SqlCommand mCom = new SqlCommand())
            {
                mCom.Connection = mCon;
                mCom.CommandText = "Get_UplinkID";
                mCom.Parameters.AddWithValue("@memID", memID);
                mCom.CommandType = CommandType.StoredProcedure;

                SqlDataAdapter da = new SqlDataAdapter(mCom);
                da.Fill(dt);
                if (dt.Rows.Count > 0 && retValue != 1)
                {
                    string n_upid = dt.Rows[0]["uplineId"].ToString();
                    if (n_upid.ToLower() == original_memID.ToLower())
                    {
                        retValue = 1;

                    }
                    else if( n_upid.ToLower() != original_memID.ToLower())
                    {
                        if (n_upid.ToLower() == "self")
                        {
                            retValue = 0;
                        }
                        else
                        {
                            checkUplinkID(n_upid, original_memID);  // its coming back here after returning and its returning '0' 
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            mCon.Close();
            mCon.Dispose();
        }
    }

    return retValue;

}

今問題はretValue = 1それが戻った後ですが、 checkUplinkID関数に戻り、それを作成retValue = 0して返します。それで、私は何をすべきですか?

aspx.csそして、次のように、ページでこの関数を呼び出しています。

 int getchk = iobj.checkUplinkID(memid, memberId); 

iobjそのメソッドがあるクラスのオブジェクトはどこにありますか。

4

3 に答える 3

4

checkUplinkIDの戻り値をtoに割り当てたいと思うでしょうretValue:

else
{
    retValue = checkUplinkID(n_upid, original_memID);  // its coming back here after returning and its returning '0' 
}

ああ、あなたのcatchブロックは非常に悪いスタイルです:
元のスタック トレースを削除する以外は何もしないので、例外が最初に発生した場所に関する情報はありません。catchそのブロックを削除するだけです。

于 2013-10-25T12:12:23.930 に答える
3

私の理解が正しければ、再帰呼び出しの結果は使用されません。値を保存する必要があります。

retValue = checkUplinkID(n_upid, original_memID);

それ以外の場合、再帰呼び出しの結果は使用されずretValue、「最も外側の」メソッド呼び出しの は 0 のままです。

于 2013-10-25T12:12:29.857 に答える
0

再帰の基本的な概念である BASE ケースを忘れています。これは、再帰が停止し、他のすべての呼び出しを解決して戻る場所です。そのため、再帰が停止しませんでした。

于 2013-10-25T12:15:35.693 に答える