在数据库表中的C#信息中未处理SqlException

在数据库表中的C#信息中未处理SqlException,c#,sql,sql-server,ado.net,C#,Sql,Sql Server,Ado.net,我对C#编码还不熟悉,环顾四周,发现很难推断出问题的答案 我目前正在尝试将组合框中的文本和选定文本添加到简单的数据库表中。然而,当我尝试添加信息时,我得到一个SqlException错误未处理。我看了其他答案,发现它可能与添加连接有关,我已经尝试过了,但仍然不起作用 我的代码和错误信息如下面的图片链接所示,但以防万一,这里也是我的代码 using System.Collections.Generic; using System.ComponentModel; using System.Data;

我对C#编码还不熟悉,环顾四周,发现很难推断出问题的答案

我目前正在尝试将组合框中的文本和选定文本添加到简单的数据库表中。然而,当我尝试添加信息时,我得到一个SqlException错误未处理。我看了其他答案,发现它可能与添加连接有关,我已经尝试过了,但仍然不起作用

我的代码和错误信息如下面的图片链接所示,但以防万一,这里也是我的代码

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace SavetoDbTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (SqlConnection test = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\User\\Documents\\Visual Studio 2015\\Projects\\SavetoDbTest\\SavetoDbTest\\Hobbie.mdf;Integrated Security=True")) 
            {
                using (SqlCommand again = new SqlCommand())
                {
                    again.CommandText = "INSERT INTO Table Values('" + textBox1.Text + "', '" + comboBox1.Text + "')";

                    again.Parameters.AddWithValue("@Name", textBox1.Text);
                    again.Parameters.AddWithValue("@Hobby", comboBox1.Text);
                    again.Connection = test;
                    test.Open();
                    again.ExecuteNonQuery();
                    test.Close();
                    MessageBox.Show("Data Entry Successful");

                }
            }      
        }
    }
}

+1用于尝试使用参数化查询!但你做得不对:-)

这会在查询字符串不需要参数时添加参数。可能这也是您看到的异常的原因

您的查询字符串必须如下所示:

again.CommandText = "INSERT INTO [Table] Values(@Name, @Hobby)";

而且,
在SQL中是一个保留字。因此,如果您的表名为
table
,则应将其括在方括号中。

+1用于尝试使用参数化查询!但你做得不对:-)

这会在查询字符串不需要参数时添加参数。可能这也是您看到的异常的原因

您的查询字符串必须如下所示:

again.CommandText = "INSERT INTO [Table] Values(@Name, @Hobby)";
而且,
在SQL中是一个保留字。因此,如果您的表名为
table
,则应将其括在方括号中。

使用此选项,而不是:

private void button1_Click(object sender, EventArgs e)
{
    using (SqlConnection test = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\User\\Documents\\Visual Studio 2015\\Projects\\SavetoDbTest\\SavetoDbTest\\Hobbie.mdf;Integrated Security=True")) 
    {
        using (SqlCommand again = new SqlCommand())
        {
            again.CommandText = "INSERT INTO [TableName] Values(@Name,@Hobby)";
            again.Parameters.AddWithValue("@Name", textBox1.Text);
            again.Parameters.AddWithValue("@Hobby", comboBox1.Text);
            again.Connection = test;
            test.Open();
            again.ExecuteNonQuery();
            test.Close();
            MessageBox.Show("Data Entry Successful");
         }
    }      
}
使用此选项,而不是:

private void button1_Click(object sender, EventArgs e)
{
    using (SqlConnection test = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\User\\Documents\\Visual Studio 2015\\Projects\\SavetoDbTest\\SavetoDbTest\\Hobbie.mdf;Integrated Security=True")) 
    {
        using (SqlCommand again = new SqlCommand())
        {
            again.CommandText = "INSERT INTO [TableName] Values(@Name,@Hobby)";
            again.Parameters.AddWithValue("@Name", textBox1.Text);
            again.Parameters.AddWithValue("@Hobby", comboBox1.Text);
            again.Connection = test;
            test.Open();
            again.ExecuteNonQuery();
            test.Close();
            MessageBox.Show("Data Entry Successful");
         }
    }      
}

代码中有3个问题。 1) 您已为表名、表名保留关键字 2) 根据代码生成的SQL查询不正确。 3) 您需要指定您的命令类型

解决方案:将表名更改为有意义的名称,如employeedata或testdata,并根据下面给出的内容修改代码

again.CommandType =  CommandType.Text;
again.CommandText = "INSERT INTO TestData(ColumnName1,ColumnName2) Values('" + textBox1.Text + "', '" + comboBox1.Text + "')";
               again.Connection = test;
                test.Open();
                again.ExecuteNonQuery();
                test.Close();
                MessageBox.Show("Data Entry Successful");

代码中有3个问题。 1) 您已为表名、表名保留关键字 2) 根据代码生成的SQL查询不正确。 3) 您需要指定您的命令类型

解决方案:将表名更改为有意义的名称,如employeedata或testdata,并根据下面给出的内容修改代码

again.CommandType =  CommandType.Text;
again.CommandText = "INSERT INTO TestData(ColumnName1,ColumnName2) Values('" + textBox1.Text + "', '" + comboBox1.Text + "')";
               again.Connection = test;
                test.Open();
                again.ExecuteNonQuery();
                test.Close();
                MessageBox.Show("Data Entry Successful");

PaulF
所述,使用
Try..Catch
块始终是一种很好的做法。如果代码不适合您,它将向您提供异常消息。给你

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        using (SqlConnection test = new SqlConnection("YourConnectionStringName"))
        {
            using (SqlCommand again = new SqlCommand())
            {
                again.CommandText = "INSERT INTO Table Values(@Name,@Hobby)";
                again.Parameters.AddWithValue("@Name", textBox1.Text);
                again.Parameters.AddWithValue("@Hobby", comboBox1.Text);
                again.Connection = test;
                test.Open();
                again.ExecuteNonQuery();
                test.Close();
                MessageBox.Show("Data Entry Successful");

            }
        }
    }
    catch (Exception ex)
    {   
        throw ex;
    }
}

检查它是否工作。希望它至少能给你一个领先的结果,让你知道如果出现任何异常

PaulF
所述,使用
Try..Catch
块始终是一个很好的做法。如果代码不适合您,它将向您提供异常消息。给你

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        using (SqlConnection test = new SqlConnection("YourConnectionStringName"))
        {
            using (SqlCommand again = new SqlCommand())
            {
                again.CommandText = "INSERT INTO Table Values(@Name,@Hobby)";
                again.Parameters.AddWithValue("@Name", textBox1.Text);
                again.Parameters.AddWithValue("@Hobby", comboBox1.Text);
                again.Connection = test;
                test.Open();
                again.ExecuteNonQuery();
                test.Close();
                MessageBox.Show("Data Entry Successful");

            }
        }
    }
    catch (Exception ex)
    {   
        throw ex;
    }
}

检查它是否工作。希望它至少能让您提前一步得到结果,让您知道是否出现任何异常

正是因为
是保留关键字,所以才会引发此异常。当SQL引擎希望找到表的正确名称时,会遇到这个保留关键字,从而引发异常。请尝试指定正确的表名,因为我相信这个
名称只是作为示例给出的

你的陈述应该更像这样
插入MyTable值…


关于以不正确的方式使用参数化查询的其他答案也是有效的。

正是因为
table
是保留关键字,所以引发了此异常。当SQL引擎希望找到表的正确名称时,会遇到这个保留关键字,从而引发异常。请尝试指定正确的表名,因为我相信这个
名称只是作为示例给出的

你的陈述应该更像这样
插入MyTable值…


关于以不正确的方式使用参数化查询的其他答案也是有效的。

为什么不将button1\u Click的内容括在try--catch块中,查看引发了什么异常。@PaulF或在visual studio中按住control-alt-e时弹出的屏幕上打几个复选标记,在调试器中引发异常。此外,这不是使用
connectionstring
的标准方法,使用类似
connectionstring设置myset=ConfigurationManager.connectionstring[“测试”]您使用AddWithValue语句为两个参数指定了一个值,但我在CommandText中看不到这些参数。@MarcelTheis否,反之亦然。不要直接将文本写入语句,而要删除参数!为什么不将button1_Click的内容放在一个try--catch块中,查看抛出了什么异常。@PaulF或在visual studio中按住control-alt-e时弹出的屏幕上打几个复选标记,在调试器中抛出异常。另外,这不是使用
connectionstring
的标准方法,使用类似
connectionstring设置myset=ConfigurationManager.connectionstring[“测试”]您使用AddWithValue语句为两个参数指定了一个值,但我在CommandText中看不到这些参数。@MarcelTheis否,反之亦然。不要直接将文本写入语句,而要删除参数!这是异常处理程序的第二个最无意义的实现。。。这不会提供比调试器停止显示异常时在Visual Studio中获得的stacktrace更多的详细信息。您的意思是说使用
try-catch
块没有用?如果有其他更好的方法,请告诉我。没有。在catch块中抛出异常是毫无意义的。如果你只是重复一遍,那么一开始就抓住它是没有意义的。出于调试目的,这也没有价值,因为如果未处理异常,Visual Studio将在引发异常的位置停止,并显示一个异常窗口,您可以在其中查看stacktrace和其他内容。我不是说那只手