2017-04-25 78 views
0

我有一個名爲LoginTable的訪問表,其中包含名爲Username,Password和名爲group的整數列的文本列。一個稱爲AddUser的Windows窗體,帶有一個名爲Username_txtBx的文本框和一個名爲Department_cmbBx的組合框。還有一個名爲AddBtn的按鈕。我可以在按鈕單擊事件中添加具有以下代碼的用戶。 但是我怎麼去擁有它搜索數據庫來檢查用戶名是否已經存在,以及它是否會拋出一個消息框告訴用戶它的確如果它不運行下面的代碼。我發現了很多SQL數據庫的例子,但沒有一個用於Access數據庫。檢查訪問數據庫的名稱

try 
{ 
    int g = new int(); 

    if (Department_cmbBx.SelectedItem.ToString() == "Office") 
    { 
     g = 1; 
    } 
    else if (Department_cmbBx.SelectedItem.ToString() == "Stores") 
    { 
     g = 2; 
    } 
    else if (Department_cmbBx.SelectedItem.ToString() == "Workshop") 
    { 
     g = 3; 
    } 
    else if (Department_cmbBx.SelectedItem.ToString() == "Management") 
    { 
     g = 4; 
    } 
    else if (Department_cmbBx.SelectedItem.ToString() == "Admin") 
    { 
     g = 5; 
    } 

    connection.Open(); 
    OleDbCommand command = new OleDbCommand(); 
    command.Connection = connection; 
    command.CommandText = "insert into LoginTable(Username,[Password],[Group]) values ('" + Username_txtBx.Text + "','password'," + g + ")"; 
    command.ExecuteNonQuery(); 
    connection.Close(); 
    Username_txtBx.Text = ""; 
    Department_cmbBx.Text = "";     
} 
catch (Exception ex) 
{ 
    MessageBox.Show("error " + ex); 
} 
+0

你想要一個SELECT查詢。 – john

+0

無論是sql還是訪問select查詢都不會改變,請使用您看到的用於SQL的示例 – Krishna

+0

看起來您正在以明文形式在數據庫中存儲密碼。這是一個嚴重的安全漏洞。你永遠不應該這樣做。密碼應該是一種散列和醃製的方式,您應該比較散列形式的密碼以驗證它們。 – mason

回答

2

首先,你if陳述可以用更有效,更可讀switch語句來代替。

其次,您可以使用OleDbDataReader和以下select查詢來檢查用戶名是否已經存在於您的表中。

請注意我正在使用Command.Parameters.Add這是更可靠和最好的做法,當作爲字符串編寫SQL命令。

int g; 
bool UserExists = false; 

switch(Department_cmbBx.SelectedItem.ToString()) 
{ 
    case "Office": 
     g = 1; 
     break; 
    case "Stores": 
     g = 2; 
     break; 
    case "Workshop": 
     g = 3; 
     break; 
    case "Management": 
     g = 4; 
     break; 
    case "Admin": 
     g = 5; 
     break; 
    default: 
     MessageBox.Show("error: an invalid value."); 
     break; 
} 

using (OleDbConnection connection = new OleDbConnection(connectionString)) 
{ 
    using (OleDbCommand command = new OleDbCommand("select [Username] from LoginTable where [email protected]" , connection)) 
    { 
     command.Parameters.Add("@Username", Username_txtBx.Text); 
     connection.Open(); 

     using(OleDbDataReader reader = command.ExecuteReader()) 
     { 
      // If at least 1 row was returned, this means the user exists in the table. 
      while (reader.Read()) 
      { 
       UserExists = true; 
      } 
     }  

     if (!UserExists) 
     { 
      // The user does not exists - you can create it. 
      command.Parameters.Clear(); 
      command.CommandText = "insert into LoginTable([Username],[Password],[Group]) values (@Username,@Username,@G)"; 
      command.Parameters.Add("@Username", Username_txtBx.Text); 
      command.Parameters.Add("@Password", "password"); 
      command.Parameters.Add("@G", g); 
      command.ExecuteNonQuery(); 
     } 
     else 
     { 
      // Show an error message - the user already exists 
      MessageBox.Show("The user you eneterd already exists."); 
     } 
    } 
} 
+0

請不要鼓勵sql命令的字符串連接。 – Nino

+0

雖然答案是正確的,但我會建議使用參數以避免sql注入。你可以在這裏看到一個例子https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters(v=vs.110).aspx –

+0

@Nino你100%正確,但我並不是要教導OP關於命令參數的問題,在我看來他正處於學習過程中,因此我決定不做太多修改就回答問題。 –

0

感謝梅森我無法讓你的代碼工作出於某種原因,但沒有使用switch語句和其他人說的選擇查詢。我結束了使用下面的代碼

   bool UserExists = false; 
      command.CommandText = "Select [Username] from LoginTable where Username = '" + Username_txtBx.Text + "'"; 
      OleDbDataReader reader = command.ExecuteReader(); 

      int g = new int(); 
      while (reader.Read()) 
      { 
       UserExists = true; 
      } 
      connection.Close(); 
      if (!UserExists) 
      {