2017-05-23 47 views
0

我想做一個簡單的程序,它有一個本地數據庫僅用於testing.And登錄的一部分,當我嘗試打開連接到SQL數據庫時,我不斷收到錯誤。登錄表單,SQL異常

private void logInButton_Click(object sender, EventArgs e) 
    { 
     MainMenu openMainMenu = new MainMenu(); 
     SqlConnection sqlcon = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C: \Users\Nea Florin\Desktop\PlatformaTestare\PlatformaTestare\Server.mdf;Integrated Security=True;Connect Timeout=30"); 
     sqlcon.Open(); 
     SqlCommand cmd = new SqlCommand("Select * from Table Where username ='" + usernameTextBox.Text + "' and password = '" + passwrodTextBox.Text + "'"); 
     SqlDataAdapter sda = new SqlDataAdapter(cmd); 
     DataTable dtbl = new DataTable(); 
     sda.Fill(dtbl); 
     if (dtbl.Rows.Count > 0) 
     { 
      openMainMenu.Show(); 
      this.Hide(); 
     } 
     else 
      MessageBox.Show("Wrong username or password!"); 
    } 

我得到sqlcon.Open()的錯誤,和它是:「類型的未處理的異常‘System.Data.SqlClient.SqlException’出現在system.data.dll

附加信息:嘗試爲文件C:\ Users \ Nea Florin \ Desktop \ PlatformaTestare \ PlatformaTestare \ Server.mdf附加一個自動命名的數據庫失敗。具有相同名稱的數據庫存在,或者指定的文件無法打開,或者它是位於UNC份額。「

+0

的文件名,你有C的'空格:'和'\用戶\ .... mdf' ... – t0mm13b

+1

之前,你做任何事情,閱讀關於sql注入和參數化查詢。之後,閱讀密碼散列。 –

+0

另外,瞭解異常情況以及如何正常處理它。 – t0mm13b

回答

1

那麼,我可以給你的最好的建議是google the error message。請記住,如果出現錯誤消息,則表示問題已知,因此可以確信有人在您之前遇到過問題並設法解決問題。這個搜索的前四個結果在stackoverflow上,至少有兩個已經接受了答案,所以我相信一點研究會爲你節省很長時間。
這是最好的建議,因爲它遠遠超出你當前的問題。我堅信,良好的搜索技能是sotfware開發人員最重要和最強大的工具。我可以向你保證,不管你花了多少時間開發軟件,幾乎每一個例外,其他人已經解決了,並且發佈瞭解決方案,你只需要找到它。

現在,作爲代碼它的自我 - 你還有其他一些主要的問題,那麼你是問有關異常:

  1. 連接字符串轉換爲SQL語句而不是使用參數暴露你的代碼SQL injection攻擊。這是一個非常容易解決的非常嚴重的威脅。
  2. 使用實現IDisposable接口的類的insantances而不正確地處置它們可能會導致內存泄漏。閱讀關於using聲明,並使其成爲每次可能時都使用它的習慣。
  3. 異常處理。目前,如果你的數據庫無法到達,你會得到一個異常和你的程序崩潰。您應該在代碼中無法控制的地方使用try...catch塊,以便讓程序順利地結束。 (千萬不要使用的try ... catch的東西,你可以在代碼中完成,如由零驗證用戶輸入或檢查部門 - 僅事情是博揚的控制,如數據庫可用性)

有說了這麼多,你的代碼應該是這個樣子:

private void logInButton_Click(object sender, EventArgs e) 
{ 
    using (var sqlcon = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|C:\Users\Nea Florin\Desktop\PlatformaTestare\PlatformaTestare\Server.mdf;Integrated Security=True;Connect Timeout=30")) 
    { 
     sqlcon.Open(); 
     using (var cmd = new SqlCommand("Select 1 from Table Where username = @userName and password = @password")) 
     { 
      cmd.Parameters.Add("@userName", SqlDbType.NVarChar).Value = usernameTextBox.Text; 
      cmd.Parameters.Add("@password", SqlDbType.NVarChar).Value = passwrodTextBox.Text; 
      using (var dtbl = new DataTable()) 
      { 
       using (var sda = new SqlDataAdapter(cmd)) 
       { 
        sda.Fill(dtbl); 
       } 

       if (dtbl.Rows.Count > 0) 
       { 
        var openMainMenu = new MainMenu(); 
        openMainMenu.Show(); 
        this.Hide(); 
       } 
      } 
      else 
      { 
       MessageBox.Show("Wrong username or password!"); 
      } 
     } 
    }