Я новичок в программировании на C # и осмотрелся, но мне трудно экстраполировать ответ на мою проблему.

В настоящее время я просто пытаюсь разобраться с добавлением текста и выделенного текста из поля со списком в простую таблицу базы данных. Однако, когда я пытаюсь добавить информацию, я получаю сообщение об ошибке SqlException was unhandled. Я просмотрел другие ответы и увидел, что, возможно, это связано с добавлением соединения, которое я пробовал, но он все еще не работает ...

В настоящее время я просто пытаюсь разобраться с добавлением текста и выделенного текста из поля со списком в простую таблицу базы данных. Однако, когда я пытаюсь добавить информацию, я получаю сообщение об ошибке SqlException was unhandled. Я просмотрел другие ответы и увидел, что, возможно, это связано с добавлением соединения, которое я пробовал, но он все еще не работает ...…

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");

                }
            }      
        }
    }
}

enter image description here

1
Loplac92 7 Сен 2016 в 12:47

4 ответа

Лучший ответ

Используйте это вместо:…

again.CommandText = "INSERT INTO Table Values('" + textBox1.Text + "', '" + comboBox1.Text + "')";
again.Parameters.AddWithValue("@Name", textBox1.Text);
again.Parameters.AddWithValue("@Hobby", comboBox1.Text);

Это добавляет параметры, когда строка запроса их не ожидает. Возможно, это также причина наблюдаемого вами исключения.

Строка вашего запроса должна выглядеть так:

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

Кроме того, TABLE - зарезервированное слово в SQL. Поэтому, если ваша таблица называется Table, вы должны заключить ее в квадратные скобки.

5
Thorsten Dittmar 7 Сен 2016 в 10:01

Именно это исключение возникает, потому что table - зарезервированное ключевое слово. Механизм SQL обнаруживает это зарезервированное ключевое слово, когда он ожидает найти собственное имя таблицы и, таким образом, выдает исключение. Попробуйте указать правильное имя таблицы, потому что я считаю, что это имя table было дано только в качестве примера.

Ваше утверждение должно выглядеть примерно так INSERT INTO MyTable Values ...

Также действительны другие ответы о неправильном использовании параметризованного запроса.

1
Tomas Smagurauskas 7 Сен 2016 в 09:57

В вашем коде 3 проблемы. 1) у вас зарезервировано ключевое слово для имени таблицы, таблица 2) SQL-запрос, который вы строите из кода, неверен. 3) Вам необходимо указать тип вашей команды.

Решение: измените имя таблицы на что-нибудь значимое, например, служебные данные или тестовые данные, и измените свой код в соответствии с приведенным ниже.

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");
1
iSensical 7 Сен 2016 в 10:14

Как упоминал 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;
    }
}

Проверьте, работает он или нет. Надеюсь, по крайней мере, это даст вам результат на шаг впереди, чтобы вы знали, возникнет ли какое-либо исключение.

1
hud 7 Сен 2016 в 09:57