我在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
是该方法所在类的对象。
答案 0 :(得分:4)
您最有可能希望将checkUplinkID
的返回值分配给retValue
:
else
{
retValue = checkUplinkID(n_upid, original_memID); // its coming back here after returning and its returning '0'
}
哦,你的catch
块是非常坏的风格:
除了删除原始堆栈跟踪之外,它不会执行任何操作,因此您将无法获得有关异常最初源自何处的信息。只需删除catch
阻止。
答案 1 :(得分:3)
如果我理解正确,则不使用递归调用的结果。您需要存储值:
retValue = checkUplinkID(n_upid, original_memID);
否则,不使用递归调用的结果,并且“最外层”方法调用的retValue
保持为0.
答案 2 :(得分:0)
你忘记了递归的基本概念,即BASE案例,即递归停止并返回解析所有其他调用的地方。这就是你的递归没有停止的原因;