2016-04-15 32 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