【问题标题】:C# and SQL Server : conditional statement for tablesC# 和 SQL Server:表的条件语句
【发布时间】:2015-11-01 12:20:18
【问题描述】:

我有一个使用管理员和员工登录的程序。我在 SQL Server 中有两个名为 AdminEmployee 的表。

我只有一个登录窗口。我有两种形式AdminFormEmpForm。输入用户名和密码后,我想读取这两个表。

  • 如果用户名和密码属于表Admin,那么它将显示AdminForm
  • 但是当用户名和密码属于表Employee时,它会显示EmpForm

我是 SQL Server 的新手。反正有可能吗?截至目前,这是我的代码:

private void btnLogin_Click(object sender, EventArgs e)
{    
    using (var connect = sqlcon.getConnection())
    {
         using (SqlCommand cmd = new SqlCommand("SELECT * FROM administrator WHERE username = @username AND password = @password"))
         {
              cmd.Connection = connect;
              connect.Open();
              cmd.Parameters.Add("@cusername", SqlDbType.Char).Value = tbUsername.Text;
              cmd.Parameters.Add("@cpassword", SqlDbType.Char).Value = tbPassword.Text;
              using (SqlDataReader re = cmd.ExecuteReader())
              {
                 if (re.Read())
                 {
                 }
                 else
                 {
                 }                               
             }                        
        }
    }
}

【问题讨论】:

  • 不要不要将您的密码存储为纯文本。阅读:stackoverflow.com/questions/1054022/…
  • 好的,我将尝试使用哈希加密。谢谢!
  • 为什么要使用两张表?使用具有用户名、密码哈希(或纯文本密码,直到应用程序正常工作)和 userType 的表(这可以是 SQL 中的 int 和 C# 中的枚举,因为 Enum.TryParse/Enum.Parse 还考虑了字符串时的情况正在尝试解析的不是枚举中的字段而是数值,例如: enum TestEnum { Test1, Test2 }, Enum.Parse(typeof(TestEnum), "1") == TestEnum.Test2。
  • 感谢您的快速响应!现在就试试。之后会公布结果。谢谢!
  • 在此处查看“markle”答案,了解更好的表格设计:stackoverflow.com/questions/332602/…

标签: c# sql sql-server datatable conditional-statements


【解决方案1】:

你需要2个带有参数用户名和密码的sql查询,一个查询返回admin的对象,另一个查询返回对象employee如果插入的参数正确,否则返回null。

尝试使用这两个查询的结果来初始化 Admin 和 Employee 的对象。 比测试

if(admin != null) 打开 AdminForm。 else if(employee != null) 打开 EmpForm。 else - 显示信息不正确的用户名或/和密码。

Soner Gönül 是正确的尝试使用带或不带盐的散列来不以明文形式存储密码。

【讨论】:

    【解决方案2】:

    您的查询可以这样工作:

    Select [EntityType] =1 , SurrogateKey = EmployeeKey, LastName, FirstName from dbo.Employee where (blah blah blah)
    UNION ALL
    Select [EntityType] = 2, SurrogateKey = AdminKey, LastName, FirstName from dbo.Admin where (blah blah blah)
    

    然后您将有一种方法来区分行....如果您得到 2 行,您可以做出决定。 EmployeeKey 和 AdminKey(无论您的 PK 名称是什么)必须是相同的数据类型。 (LastName 和 FirstName 也是如此,如果所有数据类型都匹配,则只能 UNION/UNION ALL。

    .......

    话虽如此............你已经“混合”了很多担忧。创建一个返回某种具有必要值的 POCO 对象的 DataLayer。 button_click 和 SqlConnection 不应在同一代码中。

    pubic class LoginResult()
    {
    public int EntityType {get;set;}
    public int SurrogateKey {get;set;}
    public string LastName{get;set;}
    public string FirstName{get;set;}
    }
    
    
    public interface IAccountManager
    {
    LoginResult AttemptLogin (string userName, string password)
    }
    public class IAccountManager() : IAccountManager
    {
    public LoginResult AttemptLogin (string userName, string password)
    {
    // put your SqlConnection/SqlReader code here
    // do not put any "logic" "if checks" etc....the concern here is to only create the object
    }
    }
    

    分离关注点会更好一些。谷歌“C# 层”以获得更多讨论。

    【讨论】:

      【解决方案3】:

      正如其他人所说,这不是使用用户名/密码的正确方法。但是您的问题的答案是使用联合,例如:

               using (SqlCommand cmd = new SqlCommand("SELECT 1 as IsAdmin, * 
      FROM administrator 
      WHERE username = @username AND password = @password 
          UNION ALL 
      SELECT 0 as IsAdmin, * 
      FROM employees 
      WHERE username = @username AND password = @password "))
      

      【讨论】:

      • 我发现这很有用。但是你能指导我如何在那个 SQL 命令代码之后打开表单吗?我对所有这些编码感到困惑。我不知道将代码放在哪里才能打开表单。
      • If (IsAdmin) response.redirect("/Admin/Main.aspx");
      【解决方案4】:

      架构错误。将这两个表合并为一个 Users 表,并附加一列指示用户所属的角色。

      【讨论】:

        【解决方案5】:

        我使用了管理员和员工的权限并对其进行了编码。感谢所有的想法!有需要的可以参考下面的代码。 不要忘记加密您的密码。

         private void btnLogin_Click(object sender, EventArgs e)
            {
                using (var connect = sqlcon.getConnection())
                {
                    using (SqlCommand cmd = new SqlCommand("SELECT rights FROM employee WHERE username = @username AND password = @password"))
                    {
                        cmd.Connection = connect;
                        connect.Open();
                        cmd.Parameters.Add("@username", SqlDbType.Char).Value = tbUsername.Text;
                        cmd.Parameters.Add("@password", SqlDbType.Char).Value = tbPassword.Text;
                        //SqlDataReader re = cmd.ExecuteReader();
                        string aeRights = (string)cmd.ExecuteScalar();
        
                        if (aeRights == "1")
                        {
                            frmAdmin frmA = new frmAdmin();
                            frmA.Show();
                            this.Hide();
                        }
        
                        else if (aeRights == "2")
                        {
                            frmEmp frmE = new frmEmp();
                            frmE.Show();
                            this.Hide();
                        }
        
                        else if (string.IsNullOrEmpty(aeRights))
                        {
                            MessageBox.Show("Invalid username or password! Please try again", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        }
                    }              
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2014-12-18
          • 2020-03-22
          • 2012-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-02
          • 2018-07-19
          相关资源
          最近更新 更多