c# - 这个 C# 登录表单逻辑有什么问题?

标签 c# sql-server logic

我在构建 C# 登录系统时遇到问题,首先我有一个包含以下列的数据库表:-

UserName(nvarchar(255)), 
Password(nvarchar(255)),
Admin(nvarchar(255))

以下是表中存储的信息:-

admin, 123, true
user, 123, false

我制作了一个名为 (AuthenticateUsers) 的 C# 方法来处理 SQL Server 中的登录存储过程,并且它工作正常。

这是:-

public static DataTable AuthenticateUsers()
        {
            DataTable DT = new DataTable();
            string SqlConnStr = globals.ServerConnStr;
            SqlConnection SqlConn = new SqlConnection(SqlConnStr);
            try
            {
                SqlConn.Open();

                SqlCommand cmd = new SqlCommand("AuthenticateUsers", SqlConn);

                cmd.CommandType = CommandType.StoredProcedure;


                SqlDataAdapter Adpt = new SqlDataAdapter(cmd);
                Adpt.Fill(DT);
                SqlConn.Close();

            }
            finally
            {
                SqlConn.Close();
            }
            return DT;
        }

这是存储过程:-

ALTER PROCEDURE [dbo].[AuthenticateUsers]
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT * FROM Login
END

这是登录 Windows 表单代码:

private void button1_Click(object sender, EventArgs e)
{
    DataTable dt = GlobalClasses.Data.AuthenticateUsers();
    DataRow dr = dt.Rows[0];
    try
    {
        if (dr["UserName"].ToString() == UsernameTxtBox.Text 
         && dr["Password"].ToString() == PasswordTxtBox.Text 
         && dr["Admin"].ToString() == "true")
        {
            MessageBox.Show("Hello Admin");
        }
        else if (dr["UserName"].ToString() == UsernameTxtBox.Text 
              && dr["Password"].ToString() == PasswordTxtBox.Text 
              && dr["Admin"].ToString() == "false")
        {
            MessageBox.Show("Hello Normal User");
        }
        else
        {
            MessageBox.Show("Get Away");
        }
    }
}

问题是第一个和最后一个 if 语句正常工作,但是第二个 if 语句根本不起作用,我做了一个断点 就从 if 语句 2 跳到了 if 语句 3 的消息框。

有什么问题吗?

最佳答案

无意冒犯,但真正的答案是一切

  • 您对表中的所有内容使用 nvarchar(255) 列。
    用户名很少超过 15 个字符,密码通常在 4 到 6 个字符之间。您可以安全地使用 nvarchar(20) 作为用户名和密码,并使用 Bit 列作为 Admin
  • 你的列名不好。用户名、密码和管理员是大多数数据库中的保留字。我的建议是使用表名作为列名的前缀:Login_UserNameLogin_PasswordLogin_Admin
  • 您正在将密码以纯文本形式保存在数据库中。密码只能以加密方式保存。
  • 您正在使用存储过程将表中的所有数据选择回 C# 代码。您应该做的是将用户的输入作为参数传递给存储过程,并仅将您需要的数据返回到您的 C# 程序。

正确的存储过程看起来更像是这样:

ALTER PROCEDURE [dbo].[AuthenticateUsers]
(
    @UserName nvarchar(255),
    @Password nvarchar(255)
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT Admin 
FROM Login
WHERE UserName = @UserName
AND Password = @Password

END

(这与您当前的表格一致)

关于c# - 这个 C# 登录表单逻辑有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29727478/

相关文章:

c# - 与访客的抽象树

sql - 使用存储过程返回 Max

java - 有没有办法避免一个类同时实现2个特定的接口(interface)?

c - 这段 C 代码有什么问题?如果有逻辑错误请提出正确的方法

c# - 使用 PageViewer 和 LayoutPagerAdapter 时的内存管理

c# - 将 24bpp 位图转换为 1bpp

c# - 添加一些元素破坏了表单按键事件

sql - 检查值是否在不同的表中

python - PyODBC 查询的 Unicode 问题

algorithm - 命题逻辑算法中的困惑