C# &引用;“未处理的例外情况”;SqlConnection打开()期间出错

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

在我的程序中,我有两个文本输入字段(windows窗体)和一个按钮,用于将这些值添加/保存到DB表中。问题是,一旦我单击按钮,它不会将输入插入数据库,而是显示我在下面附加的错误,如图所示

我的程序有什么问题

我的工作代码:

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是一个保留字,我相信它需要