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

时间:2013-09-26 21:55:47

标签: c# .net sql sql-server sqlconnection

使用创建的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;
            }

        }

    }

第1版(编辑前):

        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 个答案:

答案 0 :(得分:3)

表是SQL中的保留关键字。尝试在其周围放置方括号:

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

答案 1 :(得分:2)

表是关键字。如果您的表名为Table,则您的SQL必须将其转义。试试[Table]

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

答案 2 :(得分:1)

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

从表中选择用户名= userName

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

    cmd.Parameters [“@ username”]。Value =“Bob”;

答案 3 :(得分: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);
    }
}

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