2011-01-07 4 views
1

Я продолжаю получать сообщение об ошибке при попытке вставить значения в базу данных Access.Как решить синтаксическую ошибку при использовании этого оператора INSERT INTO и пространства имен .NET OleDb?

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

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(); 
} 
+2

Можете ли вы разместить сообщение об ошибке, которую вы получаете? – nabrond

+1

вы получаете исключение? Сбой приложения? Закройте инструкции в блоке try..catch, поймайте исключение и опубликуйте сообщение об исключении. –

+0

Привет, это сообщение об исключении: Синтаксис Ошибка в инструкции INSERT INTO OleDbException был необработанным – Howard

ответ

8

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

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

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

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

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

+1

@Howard: Не более подробной информации? О, хорошо, это все еще лучше, чем даже не зная об этом. Когда ваш SQL параметризуется, может быть легче увидеть проблему - или она может просто исчезнуть в любом случае, если ошибка связана с вашими данными, содержащими кавычки. –

+0

О, великий эксперт SO, пожалуйста, дайте нам краткое описание степени опасности SQL Injection с хранилищем данных Jet/ACE. Возможно, вы захотите выполнить поиск SO, прежде чем отвечать на него ... –

+0

@ David-W-Fenton: Мне кажется, что * некоторые классы SQL-инъекций не применимы здесь (с участием DML), но другие классы могут быть (те, у кого есть прямой код «WHERE X =» + + + «». (Я читал ваше сообщение по адресу http://www.pcreview.co.uk/forums/thread-4021211.php, в котором упоминалось об этом, и связанные с SO-сообщениями). Кроме того, параметризованный SQL хранит данные отдельно от кода, который я рассматриваю как общий очиститель. Наконец, я легко * вижу, что кто-то портировал этот код из Jet/ACE на другую платформу базы данных, не пересматривая все возможные опасности –

4

Я отправил это в качестве комментария к дубликату вопрос по адресу: Syntax error in INSERT INTO statement in c# OleDb Exception cant spot the error

Положите скобки [] вокруг имени таблицы "User". Это зарезервированное слово на сервере SQL .

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

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

0

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

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

0
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; 



    } 
+1

OleDbDataReader dr = cmd1.ExecuteReader(); на этот момент он показывает свою синтаксическую ошибку, а простой режим работы хорошо ......... – user1289578

0

После этого

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] имеет нелегальный формат

1

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

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

+0

Мне пришлось поставить [] вокруг имен таблиц и столбцов в запросе, чтобы позволить зарезервированное слово быть принятым. –

 Смежные вопросы

  • Нет связанных вопросов^_^