有人能指出我的代码有什么问题吗?第一个函数在与第二个函数不同的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)
{
}
}
答案 0 :(得分: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”变量,因为它是不必要的;如果你只想在那个地方使用它,我建议你自己返回真/假值。
答案 1 :(得分:2)
是的,你把它改成什么都没有,但是你仍然期望它会返回一些东西,因为你还在尝试使用结果:
if (clsDataLayer.SaveUser( ...
要么改变期望(失去将有价值的信息返回给调用者的能力),要么返回原始版本并确保所有代码路径都返回一个值。
你教授的建议类似于:
你:我的车轮胎漏气了 教授:好吧,把轮胎关掉 你:呃,现在我的车仍然不会去。
虽然教授建议拆除瘪胎确实解决了当前问题(因为你的车不再有瘪胎),但这并不是一个合适的解决方案。在不理解问题的根本原因(a) 的情况下改变事物经常导致您目前发现自己的情况。
你的教授应该建议你理解为什么你得到错误并修复那个,而不是选择快速修复其他地方的分支。
(a)这个问题的根本原因并不是你的值返回一个布尔值,而是因为调用者期望的内容和被调用者提供的内容之间存在不匹配。
答案 2 :(得分:1)
我不同意你的教授的建议。将方法的返回类型更改为void,因为所有路径都不返回值,就像在受感染的剪切上打一个绷带并期望它愈合一样。
更好的解决方案IMO将确保所有路径执行返回一个值(true或false)。
例如,在您的方法中,更改:
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;
}