登录表单,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 上,其中至少有两个已经接受了答案,所以我相信稍微研究一下就会节省你很长时间。
这是最好的建议,因为它远远超出了您当前的问题。我坚信良好的搜索技能是软件开发人员最重要和最强大的工具。我可以向你保证,无论你在开发软件上花费了多少时间,几乎每一个你遇到的异常,其他人已经解决并在某处发布了解决方案,你只需要找到它。
现在,至于代码本身 - 除了您询问的异常之外,您还有一些主要问题:
- 将字符串连接到 sql 语句而不是使用参数会使您的代码暴露于 SQL injection 攻击。这是一个非常严重的威胁,非常容易修复。
- 使用 类 的实现了 IDisposable 接口的实例而没有正确处理它们可能会导致内存泄漏。阅读
using
语句并养成每次可能时使用它的习惯。
- 异常处理。目前,如果无法访问您的数据库,您会得到一个异常并且您的程序会崩溃。您应该在代码中无法控制的任何地方使用
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!");
}
}
}
我正在尝试制作一个简单的程序,它有一个登录部分,本地数据库只用于 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 上,其中至少有两个已经接受了答案,所以我相信稍微研究一下就会节省你很长时间。
这是最好的建议,因为它远远超出了您当前的问题。我坚信良好的搜索技能是软件开发人员最重要和最强大的工具。我可以向你保证,无论你在开发软件上花费了多少时间,几乎每一个你遇到的异常,其他人已经解决并在某处发布了解决方案,你只需要找到它。
现在,至于代码本身 - 除了您询问的异常之外,您还有一些主要问题:
- 将字符串连接到 sql 语句而不是使用参数会使您的代码暴露于 SQL injection 攻击。这是一个非常严重的威胁,非常容易修复。
- 使用 类 的实现了 IDisposable 接口的实例而没有正确处理它们可能会导致内存泄漏。阅读
using
语句并养成每次可能时使用它的习惯。 - 异常处理。目前,如果无法访问您的数据库,您会得到一个异常并且您的程序会崩溃。您应该在代码中无法控制的任何地方使用
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!");
}
}
}