gpt4 book ai didi

c# - 没有得到返回值

转载 作者:行者123 更新时间:2023-12-03 23:05:21 29 4
gpt4 key购买 nike

我正在尝试获取返回值,但它一直给我一个错误。在通过向用户名发送用户名验证用户名后,我试图获取“roleid”——我不知道我做错了什么?

public string ValidateRole(string sUsername)
{
string matchstring = "SELECT roleid FROM tblUserRoles WHERE UserName='" + sUsername +"'";
SqlCommand cmd = new SqlCommand(matchstring);
cmd.Connection = new SqlConnection("Data Source=(local);Initial Catalog=samplename;Integrated Security=True");
cmd.Connection.Open();
cmd.CommandType = CommandType.Text;

SqlDataAdapter sda = new SqlDataAdapter();
DataTable dt = new DataTable();
sda.SelectCommand = cmd;
sda.Fill(dt);

string match;
if (dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
match = row["roleid"].ToString();
return match;
}
}
else
{
match = "fail";
return match;
}
}

最佳答案

您看到的“并非所有代码路径都返回一个值”错误是编译器错误,而不是运行时错误,因此问题在于您的 C# 代码不正确。

在这种情况下,这是因为您在 foreach 循环中有一个 return 语句,并且编译器不够智能,无法看到如果数据表中没有行,您的代码将沿着“else”路径运行。 IE。编译器看不到“If (true)”分支将始终返回一个值。

最佳做法是始终在函数末尾有一个返回语句,并初始化您的变量(“匹配”未初始化)。如果您中途返回,您的代码的可读性也会降低。

最简单的修复是:

 public string ValidateRole(string sUsername)
{

string matchstring = "SELECT roleid FROM tblUserRoles WHERE UserName='" + sUsername +"'";
SqlCommand cmd = new SqlCommand(matchstring);
cmd.Connection = new SqlConnection("Data Source=(local);Initial Catalog=samplename;Integrated Security=True");
cmd.Connection.Open();
cmd.CommandType = CommandType.Text;

SqlDataAdapter sda = new SqlDataAdapter();
DataTable dt = new DataTable();
sda.SelectCommand = cmd;
sda.Fill(dt);

string match = "fail";
if (dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
match = row["roleid"].ToString();
return match;
}

}

return "fail";

}

但是,您可能不知道代码还有其他几个问题:

  1. 你有一个 SQL Injection使你的弱点应用程序完全不安全。这是因为你有连接 SQL 字符串来进行查询而不是编写 parametized query .

  2. 您应该养成使用 ADO.NET DataReader 的习惯通过 DataAdapters 和 DataTables。或者更好的是,完全避免 DataTables 作为他们是遗产。为您的数据使用 Linq2Sql 或 Entity Framework 访问层,您将编写更少的代码。

  3. 您应该认真考虑使用 ASP.NET Membersip API用于您的授权和角色等。如果您这样做,您的功能甚至都不需要 - 您只需编写:Roles.IsUserInRole(sUserName, "User") 来检查用户是否处于特定角色。

  4. 当您使用实现 IDisposable 的资源(如 SQLConnection)时,您应该将其使用包装在 using() {} block 中。以便您始终尽快释放资源。

关于c# - 没有得到返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13792791/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com