2013-05-08 147 views
1

我有一個包含名爲「用戶(登錄,密碼,名字,姓氏)」的表的數據庫。我需要製作登錄頁面。我看過一些教程,但沒有幫助。我需要檢查數據庫中是否存在登錄名和密碼。然後重定向(如果正確)到其他頁面。這是我已經做過的:數據庫MS Access 2007連接到C#ASP.net,登錄頁面

OleDbConnection con = new OleDbConnection(); 
    public bool check() 
    { 
     con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Volodia\Documents\WebSiteDatabase.accdb"; 
     con.Open(); 
     string commandstring = "SELECT login,password FROM User"; 
     //objadapter = new SqlDataAdapter(CommandString, sqlconn.ConnectionString); 
     OleDbDataAdapter objadapter = new OleDbDataAdapter(commandstring, con.ConnectionString); 
     DataSet dataset = new DataSet(); 
     objadapter.Fill(dataset, "User");// it shows "Syntax error in FROM clause." here 
     DataTable datatable = dataset.Tables[0]; 
     for (int i = 0; i < datatable.Rows.Count; i++) 
     { 
      string unam = datatable.Rows[i]["login"].ToString(); 
      string upwd = datatable.Rows[i]["password"].ToString(); 
      if ((unam == TextBox1.Text)&&(upwd==TextBox2.Text)) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 
    protected void Button1_Click(object sender, EventArgs e) 
    { 
     if (check() == true) 
     { 
      Response.Redirect("WebForm2.aspx"); 
     } 
    } 

回答

1

PASSWORD這個詞是MS-Access Jet SQL的保留關鍵字。如果你想使用它,你需要把它們放在方括號,同樣爲用戶

string commandstring = "SELECT login, [password] FROM [User]"; 

這將解決Syntax Error的迫在眉睫的問題,但讓我添加一些其他的代碼來顯示不同的方法

public bool check() 
{ 
    string conString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Volodia\Documents\WebSiteDatabase.accdb"; 
    using(OleDbConnection con = new OleDbConnection(conString) 
    { 
     con.Open(); 
     string commandstring = "SELECT count(*) as cntUser FROM [User] " + 
           "WHERE login = ? AND [password] = ?"; 
     using(OleDbCommand cmd = new OleDbCommand(commandstring, con)) 
     { 
      cmd.Parameters.AddWithValue("@p1", TextBox1.Text); 
      cmd.Parameters.AddWithValue("@p2", TextBox2.Text); 
      int result = (int)cmd.ExecuteScalar(); 
      if(result > 0) 
       return true; 
     } 
    } 
    return false; 
} 
  • 首先,請不要使用全局連接對象,而應僅在需要時創建並使用連接 。
  • 其次,封裝像using語句的連接和 命令,以確保正確的關閉 和處置一次性物品,
  • 第三,通過用戶名和密碼作爲其中 子句條件(更稍後)
  • 四,使用參數化查詢,以避免語法錯誤和SQL注入

通常不是存儲在數據庫中明文密碼的好習慣。你只需要存儲密碼的哈希值,並重新計算這個哈希每次你需要檢查用戶的真實性

+0

非常感謝,它解決了我的問題=) – user2362291 2013-05-08 12:36:53

+0

哇,這個代碼是更加優化和更好的工作,thx – user2362291 2013-05-08 12:46:24