C# &引用;“未处理的例外情况”;SqlConnection打开()期间出错
在我的程序中,我有两个文本输入字段(windows窗体)和一个按钮,用于将这些值添加/保存到DB表中。问题是,一旦我单击按钮,它不会将输入插入数据库,而是显示我在下面附加的错误,如图所示 我的程序有什么问题 我的工作代码:C# &引用;“未处理的例外情况”;SqlConnection打开()期间出错,c#,sql,visual-studio,sqlconnection,C#,Sql,Visual Studio,Sqlconnection,在我的程序中,我有两个文本输入字段(windows窗体)和一个按钮,用于将这些值添加/保存到DB表中。问题是,一旦我单击按钮,它不会将输入插入数据库,而是显示我在下面附加的错误,如图所示 我的程序有什么问题 我的工作代码: public partial class Form1 : Form { //original Connection string is exactly the following: //Data Source=(LocalDB)\MSSQLLocalDB;At
public partial class Form1 : Form
{
//original Connection string is exactly the following:
//Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename="C:\Users\Sanad Al Nahaj\Documents\thesaurus.mdf";Integrated Security=True;Connect Timeout=30
SqlConnection conn = new SqlConnection(@"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename=C:\Users\Sanad Al Nahaj\Documents\thesaurus.mdf;Integrated Security = True; Connect Timeout = 30");
public Form1()
{
InitializeComponent();
}
//Save button
private void button1_Click(object sender, EventArgs e)
{
conn.Open();//error pops up here after clicking the button
SqlCommand command = conn.CreateCommand();
command.CommandType = CommandType.Text;
command.CommandText = "insert into Table values('"+wordbox.Text+"','"+synonymbox.Text+"')";
command.ExecuteNonQuery();
conn.Close();
MessageBox.Show("Word and Synonym added!");
}
private void display_Click(object sender, EventArgs e)
{
//implement
}
}
错误:
数据库看起来像:
更新: 我使用模式在
中的修改(参考CDove的回答):
你需要做四件事。首先,解决这个问题:
"insert into [Table] values('"+wordbox.Text+"','"+synonymbox.Text+"')"
在Microsoft SQL中,如果我没记错的话,insert上的values()
语法首先需要显式声明列。此外,“Table”是一个保留字,因此您需要将其放在括号中,以便将该字用作表名。今后,避免在表模式中使用保留字
"insert into [Table] (word, synonym) values ('"+wordbox.Text+"','"+synonymbox.Text+"')"
第二。而是创建参数
"insert into [Table] (word, synonym) values (@word,@syn)"
然后
command.Parameters.AddWithValue("@word", wordbox.Text);
command.Parameters.AddWithValue("@syn", synonymbox.Text);
command.ExecuteNonQuery();
第三,不要缓存连接。这就是它在代码顶部的作用,为您留下一个需要微观管理的连接:
SqlConnection conn = new SqlConnection(@"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename=C:\Users\Sanad Al Nahaj\Documents\thesaurus.mdf;Integrated Security = True; Connect Timeout = 30");
理想情况下,您可以从web.config或app.config阅读此内容,我们将使用您的硬编码字符串;别管它了
string conn = @"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename=C:\Users\Sanad Al Nahaj\Documents\thesaurus.mdf;Integrated Security = True; Connect Timeout = 30";
最后,使用using
模式。这不仅是不那么难闻的代码,而且还包括隐式.Close()
和.Dispose()
,以隐式try finally
的方式
private void button1_Click(object sender, EventArgs e)
{
using(var command = new SqlCommand(
"insert into [Table] (word, synonym) values (@word,@syn)",
new SqlConnection(conn)
))
{
command.Connection.Open();//Since we aren't reopening an old connection, errors are less likely.
command.CommandType = CommandType.Text;
command.Parameters.AddWithValue("@word", wordbox.Text);
command.Parameters.AddWithValue("@syn", synonymbox.Text);
if(command.ExecuteNonQuery() > 0 )
MessageBox.Show("Word and Synonym added!");
}
}
注意,我检查了ExecuteNonQuery
的值。这是因为该函数返回受影响的行数;如果计数为0,则未添加单词和同义词
注意:这些都是我午餐休息时脑子里想不出来的,所以你自己测试一下,看看效果如何 你需要做四件事。首先,解决这个问题:
"insert into [Table] values('"+wordbox.Text+"','"+synonymbox.Text+"')"
在Microsoft SQL中,如果我没记错的话,insert上的values()
语法首先需要显式声明列。此外,“Table”是一个保留字,因此您需要将其放在括号中,以便将该字用作表名。今后,避免在表模式中使用保留字
"insert into [Table] (word, synonym) values ('"+wordbox.Text+"','"+synonymbox.Text+"')"
第二。而是创建参数
"insert into [Table] (word, synonym) values (@word,@syn)"
然后
command.Parameters.AddWithValue("@word", wordbox.Text);
command.Parameters.AddWithValue("@syn", synonymbox.Text);
command.ExecuteNonQuery();
第三,不要缓存连接。这就是它在代码顶部的作用,为您留下一个需要微观管理的连接:
SqlConnection conn = new SqlConnection(@"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename=C:\Users\Sanad Al Nahaj\Documents\thesaurus.mdf;Integrated Security = True; Connect Timeout = 30");
理想情况下,您可以从web.config或app.config阅读此内容,我们将使用您的硬编码字符串;别管它了
string conn = @"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename=C:\Users\Sanad Al Nahaj\Documents\thesaurus.mdf;Integrated Security = True; Connect Timeout = 30";
最后,使用using
模式。这不仅是不那么难闻的代码,而且还包括隐式.Close()
和.Dispose()
,以隐式try finally
的方式
private void button1_Click(object sender, EventArgs e)
{
using(var command = new SqlCommand(
"insert into [Table] (word, synonym) values (@word,@syn)",
new SqlConnection(conn)
))
{
command.Connection.Open();//Since we aren't reopening an old connection, errors are less likely.
command.CommandType = CommandType.Text;
command.Parameters.AddWithValue("@word", wordbox.Text);
command.Parameters.AddWithValue("@syn", synonymbox.Text);
if(command.ExecuteNonQuery() > 0 )
MessageBox.Show("Word and Synonym added!");
}
}
注意,我检查了ExecuteNonQuery
的值。这是因为该函数返回受影响的行数;如果计数为0,则未添加单词和同义词
注意:这些都是我午餐休息时脑子里想不出来的,所以你自己测试一下,看看效果如何 我想我看到了一个问题:你没有正确处理连接。将连接作为类规模变量保持打开的整个模式是一个坏主意。创造。使用。处置这是处理可处置物品的唯一方法()。不要担心性能。SQLConenction本身可能会执行一些连接池。最后,一个无故障运行的程序优先。请您尝试在您的web.config文件中执行以下操作,然后再试一次。Eray Balkalli,您的意思是在我的web.config文件中吗?在这种情况下,它应该在标记内部吗?我指的是相关应用程序的web.config文件。我相信你会在Visual Studio的项目下看到它。我想我看到了一个问题:你没有正确地处理连接。将连接作为类规模变量保持打开的整个模式是一个坏主意。创造。使用。处置这是处理可处置物品的唯一方法()。不要担心性能。SQLConenction本身可能会执行一些连接池。最后,一个无故障运行的程序优先。请您尝试在您的web.config文件中执行以下操作,然后再试一次。Eray Balkalli,您的意思是在我的web.config文件中吗?在这种情况下,它应该在标记内部吗?我指的是相关应用程序的web.config文件。我相信你会在Visual StudioTable项目下看到它,我相信它是一个保留字,所以它需要放在括号中。很好。我将把它添加到答案中。谢谢你的回答,但我不清楚“使用”模式。整个代码块应该放在按钮单击方法中吗?请您立即格式化并编写整个更正后的代码,这样我就不会感到困惑。使用
专门使用该对象遍历代码块。它们是一种使用对象继承的方法IDisposable
。在本例中,您只需使用
块将调用数据库的代码包装在中,并以这种方式声明命令对象,如图所示。在这种情况下,它确实会进入按钮\u click
事件处理程序中。您可能希望该字符串与类级别的连接作为SqlConnection
,这样您就可以在整个类中访问该字符串。另一件事…-我怀疑您的使用将关闭与数据库的连接。-您只是在处理SqlCommand而不是连接,我怀疑处理SqlCommand是否会处理SqlConnection,因为SqlCommand无法知道SqlConnection是否像您一样被传递到构造函数中,或者它是否是范围外的变量。--我建议使用以下语法using(var-sqlConnection=new-sqlConnection(con)){sqlConnection.Open();using(var-sqlCommand=sqlConnection.CreateCommand){//do-stuff}}
Table是一个保留字,我相信它需要