2016-04-15 33 views
0

错误显示无效列名mustufain。 mustufain是UserName.Text.toString()在asp.net中查询时出错

string query = "select userid from register where username = " + UserName.Text.ToString() + " and " + "password = " + Password.Text.ToString(); 

SqlCommand cmd1 = new SqlCommand(query,connection); 
connection.Open(); 
SqlDataReader rd1 = cmd1.ExecuteReader(); 
while(rd1.Read()) 
{ 
    Session["checkuserid"] = rd1["userid"]; 
} 
connection.Close(); 
+3

首先,ASP.NET不执行查询。这是ADO.NET。其次,你应该*不*通过串联构造sql语句。使用参数化查询。在这种情况下,你不知道用户输入了什么。如果它是'1; drop table users; - ? –

+1

只是谷歌的“鲍比表”,看看会发生什么 –

+1

SqlConnection,SqlCommand和SqlDataReader实现[IDisposable](https://msdn.microsoft.com/en-us/library/system.idisposable(v = vs.110)的.aspx)。你需要在它们的'finally'块中调用dispose,或者将它们封装在[using语句](https://msdn.microsoft.com/en-us/library/yh598w02.aspx)中,以确保它们被丢弃正确。如果你现在不这样做,你会在稍后遇到问题,并且很难追查问题。 – mason

回答

3

价值首先,你不应该使用字符串连接来构建你的查询,因为它可以让你容易的事情,如SQL注入攻击,它可能会导致你的查询是不正确的问题(因为你缺少你周围参数刻度线):

// This would attempt to state username = mustufain instead of 
// username = 'mustufain' (and SQL doesn't know what mustufain is) 
var query = "select userid from register where username = '" + UserName.Text + "' and " + "password = '" + Password.Text + "'"; 

一个更好的方法使用的参数看起来像下面这样,避免了不正确的语法,为您提供保护,防止任何讨厌打针:

// Open your connection 
using(var connection = new SqlConnection("{your connection string}")) 
{ 
    // Build your query 
    var query = "SELECT TOP 1 userid FROM register WHERE username = @username AND password = @password"; 
    // Build a command (to execute your query) 
    using(var command = new SqlCommand(query, connection)) 
    { 
      // Open your connection 
      connection.Open(); 
      // Add your parameters 
      command.Parameters.AddWithValue("@username",UserName.Text); 
      command.Parameters.AddWithValue("@password",Password.Text); 
      // Execute your query 
      var user = Convert.ToString(command.ExecuteScalar()); 
      // If a user was found, then set it 
      if(!String.IsNullOrEmpty(user)) 
      { 
       Session["checkuserid"] = user; 
      } 
      else 
      { 
       // No user was found, consider alerting the user 
      } 
    } 
} 

最后,您可能想重新考虑如何存储凭据(以明文形式)。 ASP.NET提供了各种各样的提供者,可以帮助你处理这个过程,这样你就不必亲自去做。

3

您试图连接字符串来构建一个sql查询,并像往常一样,你会得到错误。在你的具体情况下,你忘记把你的字符串值放在单引号之间。但要做到这查询的唯一正确途径是通过参数化查询的方式

string query = @"select userid from register 
       where username = @name and password = @pwd"; 
using(SqlCommand cmd1 = new SqlCommand(query,connection)) 
{ 
    connection.Open(); 
    cmd1.Parameters.Add("@name", SqlDbType.NVarChar).Value = UserName.Text; 
    cmd1.Parameters.Add("@pwd", SqlDbType.NVarChar).Value = Password.Text; 
    using(SqlDataReader rd1 = cmd1.ExecuteReader()) 
    { 
     .... 
    } 
} 

还要注意保存明文密码在你的数据库是一个非常不好的做法和强有力的风险保障。在这个网站上有一些说明如何创建密码的哈希值,而是存储明文

例如的散列众多的问题和答案:Best way to store passwords in a database