2013-09-26 59 views
1

正在使用创建的SQL Server表构建一个简单的.NET Web应用程序。我继续得到错误关于SqlDataReader,并坚持我要去哪里错了。.NET SqlDataReader:SqlException被用户代码未处理

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

这里是我的代码:

编辑:

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

回答

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

另外,请介意在纯文本中将密码存储在数据库中被认为是一种不好的做法。某些类型的散列函数应该应用于记忆的密码,以便在有人获得数据库副本时禁止任何安全问题。

+0

thx for response。我输入了你的建议并且编译得很好,但是并没有给我一个结果。我上面更新了我的代码。 – Bachzen

+0

我的不好,应该是ExecuteScalar不是ExecuteNonQuery。 ExecuteScalar返回返回数据集的第一行的第一列。 SELECT COUNT(*)只返回一列一列。 ExecuteNonQuery返回由INSERT/UPDATE/DELETE操作影响的行数,而不是由SELECT语句返回的行数 – Steve

+0

告诉我指定的转换是无效的:int result =(int)cmd.ExecuteScalar(); – Bachzen

2

表是一个关键词。如果你的表被称为Table,你的sql必须转义它。尝试[Table]

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

3

表是SQL中的保留关键字。尝试把它放在方括号内:

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

我认为你的SQL查询有2个问题。

“从表SELECT用户名其中用户名=用户名

  1. 是保留关键字。使用另一个名称的表或[表]
  2. 最后一部分,用户名=用户名,也是错误的。如果你的意图是在那里有一个不变的字符串,你应该考虑把用户名放在引号\'username \'。不要忘记逃跑符号。如果你想传递参数给SqlCommand,使用@username查询和传递价值这样

    cmd.Parameters [“@用户名”]值=“鲍勃”。

相关问题