.NET SqlDataReader:SqlException 未由用户代码处理

本文关键字:用户 代码 处理 SqlDataReader SqlException NET | 更新日期: 2023-09-27 18:33:08

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

这是我的错误:其他信息:关键字"Table"附近的语法不正确。

这是我的代码:

编辑:

            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;
        }

.NET SqlDataReader:SqlException 未由用户代码处理

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

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

表是一个关键字。如果你的表被调用 Table ,你的 sql 必须转义它。试试[Table] .

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

您的 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);
    }
}

另外,请记住,以纯文本形式将密码存储在数据库中被认为是一种不好的做法。应该对记忆的密码应用某种哈希函数,以便在有人获得数据库副本时禁止任何安全问题。

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

"从用户名 = 用户名的表中选择用户名"

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

    cmd.Parameters["@username"].值 = "鲍勃";