2017-05-23 32 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!"); 
      } 
     } 
    }