1

使用创建的 SQL Server 表构建简单的 .NET Web 应用程序。我不断收到有关 SqlDataReader 的错误,并且被困在哪里出错了。

这是我的错误:附加信息:关键字“表”附近的语法不正确。

这是我的代码:

编辑:

            bool authenticated = AuthenticateMe(txtUsername.Text, txtPassword.Text);

        if (authenticated)
        {
            Response.Redirect("Home.aspx");
        }
        else
        {
            Response.Redirect("Default.aspx");
        }
    }

    private bool AuthenticateMe(string username, string password)
    {
        //  string ErrorMessage = "";
        string connectionString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;Connect Timeout=30";
        string commandText = "SELECT Username from [Table] where Username = @name AND Password = @pwd";
        //   try
        //  {
        using (SqlConnection sqlConnection1 = new SqlConnection(connectionString))
        using (SqlCommand cmd = new SqlCommand(commandText, sqlConnection1))
        {
            sqlConnection1.Open();
            cmd.Parameters.AddWithValue("@name", username);
            cmd.Parameters.AddWithValue("@pwd", password);
            int result = (int)cmd.ExecuteNonQuery();

            if (result > 0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }

    }

第一版(编辑前):

        protected void bnLogin_Click(object sender, EventArgs e)
    {

        bool authenticated = AuthenticateMe(txtUsername.Text, txtPassword.Text);

        if (authenticated)
        {
            Response.Redirect("Home.aspx");
        }
        else
        {
            Response.Redirect("Default.aspx");
        }
    }

    private bool AuthenticateMe(string userName, string password)
    {

        string connectionString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;Connect Timeout=30";

        SqlConnection sqlConnection1 = new SqlConnection(connectionString);
        sqlConnection1.Open();

        SqlCommand cmd = new SqlCommand("SELECT Username from Table where Username = userName");

        cmd.Connection = sqlConnection1;

        SqlDataReader reader = cmd.ExecuteReader();
        Response.Write("Entered Sucessfully");

        reader = cmd.ExecuteReader();
        string localUserName = (string)reader["Username"];

        sqlConnection1.Close();


        if (userName.Equals(localUserName))
        {
            return true;
        }

        else
        {
            return false;
        }
4

4 回答 4

3

table 是 SQL 中的保留关键字。尝试在它周围加上方括号:

SqlCommand cmd = new SqlCommand("SELECT Username from [Table] where Username = userName");
于 2013-09-26T21:59:24.223 回答
2

表是一个关键字。如果您的表被调用Table,则您的 sql 必须对其进行转义。试试[Table]

另请注意,您需要为用户名使用参数 - 即where Username = @userName,您还可以将具有该名称的参数添加到具有适当值的命令中。

于 2013-09-26T21:58:38.287 回答
1

我认为您的 SQL 查询存在 2 个问题。

从表中选择用户名,其中用户名 = 用户名

  1. 是保留关键字。为表或[Table]使用另一个名称。
  2. 最后一部分Username = username也是错误的。如果您的意图是在那里有一个常量字符串,您应该考虑将用户名放在引号\'username\'中。不要忘记转义符号。如果要向 SQLCommand 传递参数,请在查询中使用@username并以这种方式传递值

    cmd.Parameters["@username"].Value = "Bob";

于 2013-09-26T22:07:15.707 回答
1

您的 AuthenticateMe 方法似乎有点错误并且对用户身份验证无效

  • 您使用没有正确分隔符(方括号)的保留关键字(表)
  • 您没有将用户名和密码传递给检查用户是否存在的查询
  • 你调用了两次 ExecuteReader (?)
  • 您使用用于搜索的相同值检查查询的返回值(无用)

所以你可以用这种方式重写代码

private bool AuthenticateMe(string userName, string password)
{
    string connectionString = @".....";
    string commandText = "SELECT COUNT(*) from [Table] where Username = @name AND Pass = @pwd");
    using(SqlConnection sqlConnection1 = new SqlConnection(connectionString))
    using(SqlCommand cmd = new SqlCommand(commandText, sqlConnection1))
    {
         sqlConnection1.Open();
         cmd.Parameters.AddWithValue("@name", username);
         cmd.Parameters.AddWithValue("@pwd", password);
         int result = Convert.ToInt32(cmd.ExecuteScalar());
         return (result > 0);
    }
}

另外,请记住,将密码以纯文本形式存储在数据库中被认为是一种不好的做法。如果有人得到数据库的副本,应该对记住的密码应用某种散列函数,以防止出现任何安全问题。

于 2013-09-26T22:07:26.663 回答