Синтаксическая ошибка в инструкции Insert Into C# OleDb

Я создаю форму заказа, используя С# OleDb, и у меня возникла проблема с попыткой поместить значение размера из поля со списком в форму заказа в базу данных. Код, вызывающий проблему, приведен ниже.

 private void btn_Save_Click(object sender, EventArgs e)
    {
        try
        {
            connection.Open();
            OleDbCommand command = new OleDbCommand();
            command.Connection = connection;
            command.CommandText = "insert into OrderForm(Size) values ('" + sizeBox.Text + "')";
            command.ExecuteNonQuery();
            MessageBox.Show("Order Inserted into Database");
            connection.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error " + ex);
        }
    }

Это единственный фрагмент кода, который вызывает у меня проблемы, и я сравнил его с другими строками кода commandText, которые я закомментировал, чтобы убедиться, что синтаксис правильный, и он выглядит нормально для меня. Я также проверил, чтобы имя поля, указанное в коде commandText, и поле в фактической базе данных были правильными, и это так. Любая помощь по этому вопросу будет принята с благодарностью. Ваше здоровье

Изменить: синтаксическая ошибка, которую мне выдает код Syntax Error


person user3158314    schedule 19.07.2015    source источник
comment
Может быть, размер имеет числовой тип (например, целое число)? Если это так - вам не нужна одинарная кавычка в вашем запросе   -  person dotnetom    schedule 19.07.2015
comment
Каков тип данных Size и каково значение sizeBox.Text?   -  person Patrick Hofman    schedule 19.07.2015
comment
Также НИКОГДА не объединяйте запросы, как вы только что сделали, поскольку вы уязвимы для атак SQL-инъекций.   -  person dotnetom    schedule 19.07.2015
comment
Что такое сообщение об исключении? Что такое command.CommandText?   -  person CodeCaster    schedule 19.07.2015
comment
Я прочитал это 3 раза, но я не могу понять, в чем проблема? Вы просто говорите, что вызывает у меня проблему. В любом случае, это может быть дубликат stackoverflow.com/questions/10941284/?   -  person Erki M.    schedule 19.07.2015
comment
тип данных поля размера в форме — поле со списком, тогда как тип данных размера в базе данных — текст.   -  person user3158314    schedule 19.07.2015
comment
Кроме того, имейте в виду, что если ваш ExecuteNonQuery выдает исключение, ваше соединение останется открытым. Попробуйте переместить его в блок finally или используйте оператор using.   -  person Erki M.    schedule 19.07.2015
comment
@Erki M. Я только что отредактировал код, чтобы закрыть соединение, если возникнет исключение. Ваше здоровье :)   -  person user3158314    schedule 19.07.2015


Ответы (1)


РАЗМЕР — это зарезервированное слово. Вы не можете использовать его в качестве имени поля, если не заключите его в квадратные скобки, поэтому ваш код должен быть написан как

private void btn_Save_Click(object sender, EventArgs e)
{
    try
    {
        string sqlText = "insert into OrderForm([Size]) values (?)";
        using(OleDbConnection connection = new OleDbConnection(.....))
        using(OleDbCommand command = new OleDbCommand(sqlText, connection))
        {
            connection.Open();
            command.Parameters.Add("@p1", OleDbType.VarWChar).Value = sizeBox.Text;
            int rowsAdded = command.ExecuteNonQuery();
            if(rowsAdded > 0) 
                MessageBox.Show("Order Inserted into Database");
            else
                MessageBox.Show("No Order added to the Database");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error " + ex.Message);
    }
}

Помимо заключения РАЗМЕРА в квадратные скобки, я кое-что изменил.

Сначала каждый раз, когда вы обращаетесь к базе данных, вы используете оператор using вокруг соединения и другого одноразового объекта. Это позволяет избежать утечек памяти и дорогостоящего использования ресурсов, когда они не нужны.

Во-вторых, запрос параметризуется, таким образом становится намного понятнее, что вы делаете, избегаете sql-инъекций и проблем с корректным разбором значений.

person Steve    schedule 19.07.2015