1

我有一个数据库,其中包含一个名为 "User(login,password,firstname,lastname)" 的表。我需要制作登录页面。我看过一些教程,但没有帮助。我需要检查数据库中是否存在登录名和密码。然后重定向(如果正确)到其他页面。这是我已经做过的:

OleDbConnection con = new OleDbConnection();
    public bool check()
    {
        con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Volodia\Documents\WebSiteDatabase.accdb";
        con.Open();
        string commandstring = "SELECT login,password FROM User";
        //objadapter = new SqlDataAdapter(CommandString, sqlconn.ConnectionString);
        OleDbDataAdapter objadapter = new OleDbDataAdapter(commandstring, con.ConnectionString);
        DataSet dataset = new DataSet();
        objadapter.Fill(dataset, "User");// it shows "Syntax error in FROM clause." here
        DataTable datatable = dataset.Tables[0];
        for (int i = 0; i < datatable.Rows.Count; i++)
        {
            string unam = datatable.Rows[i]["login"].ToString();
            string upwd = datatable.Rows[i]["password"].ToString();
            if ((unam == TextBox1.Text)&&(upwd==TextBox2.Text))
            {
                return true;
            }
        }

        return false;
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        if (check() == true)
        {
            Response.Redirect("WebForm2.aspx");
        }
    }
4

1 回答 1

1

PASSWORD 这个词是 MS-Access Jet SQL 的保留关键字。如果你想使用它,你需要将它括在方括号中,对于 USER 也是如此

 string commandstring = "SELECT login, [password] FROM [User]";

这将解决当前的问题,Syntax Error但让我添加一些其他代码以显示不同的方法

 public bool check()
 {
    string conString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Volodia\Documents\WebSiteDatabase.accdb";
    using(OleDbConnection con = new OleDbConnection(conString)
    {
        con.Open();
        string commandstring = "SELECT count(*) as cntUser FROM [User] " + 
                               "WHERE login = ? AND [password] = ?";
        using(OleDbCommand cmd = new OleDbCommand(commandstring, con))
        {
            cmd.Parameters.AddWithValue("@p1", TextBox1.Text); 
            cmd.Parameters.AddWithValue("@p2", TextBox2.Text);
            int result = (int)cmd.ExecuteScalar();
            if(result > 0)
               return true;
        }
    }
    return false;
}
  • 首先,不要使用全局连接对象,而是仅在需要时创建和使用连接。
  • 其次,使用 using 语句封装连接和命令等一次性对象,以确保正确关闭和处置,
  • 第三,将登录名和密码作为 where 子句的条件(稍后会详细介绍)
  • 四、使用参数化查询避免语法错误和sql注入

在数据库中以明文形式存储密码通常不是一个好习惯。您只需存储密码的哈希值,每次需要检查用户真实性时重新计算此哈希值

于 2013-05-08T12:31:35.043 回答