Как решить синтаксическую ошибку при использовании этого оператора INSERT INTO и пространства имен .NET OleDb? - PullRequest
1 голос
/ 07 января 2011

Я получаю сообщение об ошибке при попытке вставить значения в базу данных Access.

Ошибка синтаксическая, что приводит к следующему исключению:

OleDbException было необработанным Синтаксическая ошибка в инструкции INSERT INTO.

private OleDbConnection myCon;

public Form1()
{
    InitializeComponent();
    myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\File.mdb");
}

private void insertuser_Click(object sender, EventArgs e)
{
    OleDbCommand cmd = new OleDbCommand();
    myCon.Open();
    cmd.Connection = myCon;
    cmd.CommandType = CommandType.Text;

    cmd.CommandText = "INSERT INTO User ([UserID], [Forename], [Surname], " +
                                        "[DateOfBirth], [TargetWeight], [TargetCalories], [Height]) " +
                      "VALUES ('" + userid.Text.ToString() + "' , '" +
                                    fname.Text.ToString() + "' , '" +
                                    sname.Text.ToString() + "' , '" +
                                    dob.Text.ToString() + "' , '" +
                                    tarweight.Text.ToString() + "' , '" +
                                    tarcal.Text.ToString() + "' , '" +
                                    height.Text.ToString() + "')";

    cmd.ExecuteNonQuery();
    myCon.Close();
}

Ответы [ 6 ]

8 голосов
/ 07 января 2011

Ну, вы не указали, в чем заключается ошибка - но ваша первая проблема заключается в том, что вы вставляете данные непосредственно в оператор SQL. Не делайте этого. Вы приглашаете Атаки SQL-инъекции .

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

РЕДАКТИРОВАТЬ: Как упоминалось в комментариях, Jet / ACE уязвим для меньшего количества типов атак SQL-инъекций, так как он не допускает DML. Для этого оператора INSERT на самом деле может существовать уязвимость no - но для SELECT с предложением WHERE, написанным аналогичным образом, пользовательский ввод может обойти некоторые средства защиты предложения WHERE. Я настоятельно рекомендую вам использовать параметризованные запросы как само собой разумеющееся:

  • Они означают, что вам не нужно экранировать пользовательские данные
  • Они хранят данные отдельно от кода
  • Вам будет меньше о чем беспокоиться, если вы когда-нибудь перейдете из Jet / ACE (будь то перемещение этого конкретного кода или только вы лично начинаете работать с различными базами данных)
  • Для других типов данных, таких как даты, вам не нужно выполнять какую-либо работу, чтобы перевести данные в форму, подходящую для базы данных

(Вам также не нужны все вызовы ToString. Не только я ожидаю, что свойство с именем Text уже является строкой, но и тот факт, что вы используете строку конкатенация означает, что преобразование строк в любом случае произойдет автоматически.)

4 голосов
/ 07 января 2011

Я разместил это как комментарий к дублирующему вопросу по адресу: Синтаксическая ошибка в операторе INSERT INTO в c # Исключение OleDb не может обнаружить ошибку

Поставьте скобки [] вокруг имени таблицы «Пользователь». Это зарезервированное слово в SQL Сервер.

«Пользователь» также является зарезервированным словом в Access (судя по поставщику в строке подключения).

Но я полностью согласен с Джоном - если вы исправляете текущую реализацию, вы просто открываете большую дыру в безопасности (по сравнению с таблицей пользователей, не меньше!)

1 голос
/ 23 апреля 2014

Эта проблема может возникнуть, если в таблице базы данных содержатся имена столбцов, в которых используются зарезервированные слова Microsoft Jet 4.0.

Измените имена столбцов в таблице базы данных, чтобы не использовать зарезервированные слова Jet 4.0.

0 голосов
/ 12 мая 2013

После этого

cmd.CommandText="INSERT INTO User ([UserID], [Forename], [Surname], [DateOfBirth], [TargetWeight], [TargetCalories], [Height]) Values ('" + userid.Text.ToString() + "' , '" + fname.Text.ToString() + "' , '" + sname.Text.ToString() + "' , '" + dob.Text.ToString() + "' , '" + tarweight.Text.ToString() + "' , '" + tarcal.Text.ToString() + "' , '" + height.Text.ToString() + "')";

проверьте, что в нем содержится, возможно [DateOfBirth] имеет недопустимый формат

0 голосов
/ 26 марта 2012
public decimal codes(string subs)
    {
        decimal a = 0;


        con_4code();
            query = "select SUBJINTN.[SCODE] from SUBJINTN where SUBJINTN.[ABBR] = '" +                         subs.ToString() + "'";
            cmd1 = new OleDbCommand(query, concode);
            OleDbDataReader dr = cmd1.ExecuteReader();

здесь ошибка в др. Он говорит, что синтаксическая ошибка ehile в СУБД работает хорошо

            if (dr.Read())
            {
                a = dr.GetDecimal(0);
                MessageBox.Show(a.ToString());
            }
            return a;



    }
0 голосов
/ 07 января 2011

Если TargetWeight, Height и TargetCalories являются значениями с плавающей точкой или целыми числами, их не нужно заключать в кавычки в операторе SQL.

Кроме того, это не имеет прямого отношения к вашему вопросу, но вам следует рассмотреть возможность использования параметризованного запроса. Ваш код очень уязвим для внедрения SQL.

...