1

谁能指出我的代码有什么问题?第一个函数与第二个函数位于不同的 aspx 文件中。

    protected void btnManageUsersAddUser_Click(object sender, EventArgs e)
{
    if (clsDataLayer.SaveUser(Server.MapPath("PayrollSystem_DB.mdb"), txtManageUsersName.Text, txtManageUsersPassword.Text, ddlSecurityLevel.SelectedValue))
    {
        lblAddUserMsg.Text = "The user was successfully added";
        grdManagePersonnel.DataBind();
    }
    else
    {
        lblAddUserMsg.Text = "The user was not successfully added";
    }

以下函数最初是“bool”而不是“void”,但由于并非所有返回值的错误,我的教授告诉我将其更改为“void”。

    public static void SaveUser(string Database, string UserName, string UserPassword, string SecurityLevel)
{

    bool recordSaved;

    try
    {
        // Create connection
        OleDbConnection conn = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;" +
                                                   "Data Source=" + Database);
        conn.Open();
        OleDbCommand command = conn.CreateCommand();
        string strSQL;

        // Insert to tblUserLogin
        strSQL = "Insert into tblUserLogin " +
                 "(UserName, UserPassword, SecurityLevel) values ('" +
                 UserName + "', '" + UserPassword + "', '" + SecurityLevel + "')";

        // Process data
        command.CommandType = CommandType.Text;
        command.CommandText = strSQL;

        // Add your comments here
        command.ExecuteNonQuery();

        // Closes the transaction when true
        conn.Close();
        recordSaved = true;


    }
            catch (Exception ex)
    {

    }

}
4

3 回答 3

5

由于您已将方法返回类型更改为void类型,因此您不能再在此处的条件语句中使用它:

if (clsDataLayer.SaveUser(Server.MapPath("PayrollSystem_DB.mdb"), 
    txtManageUsersName.Text, txtManageUsersPassword.Text, ddlSecurityLevel.SelectedValue))

...条件期望表达式减少为布尔值。

您的教授可能有一个观点,即并非所有路径在您的代码的先前版本中都返回一个值。如果您的方法返回布尔值,则需要确保所有路径都返回 true 或 false 值。例如,您可以修改代码以再次返回布尔值并返回以下值:

...
return true;

}
catch (Exception ex)
{
   return false;
}
...

请注意,我删除了“recordSaved”变量,因为它是不必要的;如果您只打算在那个地方使用它,我建议您自己返回真/假值。

于 2013-06-24T00:17:36.980 回答
2

是的,您将其更改为不返回任何内容,但您仍然希望它返回某些内容,因为您仍在尝试使用结果:

if (clsDataLayer.SaveUser( ...

要么改变这种期望(失去向调用者返回有价值信息的能力),要么回到你的原始版本并确保所有代码路径都返回一个值。

您的教授的建议类似于:

你: 我的车爆胎了。
教授:好吧,把轮胎取下来。
你: 呃,现在我的车还是不走。

虽然教授关于拆除瘪胎的建议确实解决了眼前的问题(因为您的汽车不再有瘪胎),但这并不是一个充分的解决方案。在不了解问题的根本原因(a)的情况下进行更改经常会导致您目前所处的情况。

您的教授应该建议您了解为什么会出现错误并修复它,而不是选择快速修复并在其他地方产生影响。


(a)这个问题的根本原因不是你的值返回一个布尔值,而是因为调用者期望的和被调用者传递的不匹配。

于 2013-06-24T00:18:22.107 回答
1

我不同意你教授的建议。将方法的返回类型更改为 void 因为所有路径都不返回值,这就像在受感染的伤口上打绷带并期望它愈合一样。

IMO 更好的解决方案是确保所有路径返回一个值(真或假)。

例如,在您的方法中,更改:

bool recordSaved;

至:

bool recordSaved = false;

try然后,如果在您的部分末尾(catch行前),添加:

recordSaved = true;

然后recordSaved在退出方法之前返回:

return recordSaved;

通过这些更改,您的方法会将recordSaved值设置为 false;如果记录被保存,它只会被设置为 true。然后您可以返回该值,并在您的if检查中使用该方法。

完整的代码如下所示:

public static bool SaveUser(string Database, string UserName, string UserPassword, string SecurityLevel)
{

    bool recordSaved = false;

    try
    {
        // do your save
        recordSaved = true;
    }
    catch (Exception ex)
    {
       // Handle the exception (logging, etc)
    }

    return recordSaved;
}
于 2013-06-24T00:23:10.960 回答