登录表单,SQL 异常

LogIn form, SQL exception

我正在尝试制作一个简单的程序,它有一个登录部分,本地数据库只用于 testing.And 当我尝试打开与 [=24] 的连接时,我总是收到错误消息=] 数据库.

 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.dll

中发生了 'System.Data.SqlClient.SqlException' 类型的未处理异常

附加信息:尝试为文件 C: \Users\Nea Florin\Desktop\PlatformaTestare\PlatformaTestare\Server.mdf 附加自动命名的数据库失败。存在同名数据库,或无法打开指定文件,或位于 UNC 共享上。"

好吧,我能给你的最好建议就是 google the error message。请记住,如果出现错误消息,则意味着该问题是众所周知的,因此可以肯定有人在您之前遇到过它并设法解决了它。这个搜索的前 4 个结果在 Whosebug 上,其中至少有两个已经接受了答案,所以我相信稍微研究一下就会节省你很长时间。
这是最好的建议,因为它远远超出了您当前的问题。我坚信良好的搜索技能是软件开发人员最重要和最强大的工具。我可以向你保证,无论你在开发软件上花费了多少时间,几乎每一个你遇到的异常,其他人已经解决并在某处发布了解决方案,你只需要找到它。

现在,至于代码本身 - 除了您询问的异常之外,您还有一些主要问题:

  1. 将字符串连接到 sql 语句而不是使用参数会使您的代码暴露于 SQL injection 攻击。这是一个非常严重的威胁,非常容易修复。
  2. 使用 类 的实现了 IDisposable 接口的实例而没有正确处理它们可能会导致内存泄漏。阅读 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!");
            }
        }
    }