Синтаксическая ошибка в инструкции INSERT INTO - PullRequest
0 голосов
/ 22 декабря 2010

Я написал программу, которая подключается к MS Access.Когда я заполняю поля и добавляю новый элемент в Access, программа завершается неудачно.Исключением является «Синтаксическая ошибка в операторе INSERT INTO»

Вот соответствующий код.

****************************************************************
AdoHelper.cs
****************************************************************

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;

namespace Yad2
{
    class AdoHelper
    {
        //get the connection string from the app.config file
        //Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Yad2.accdb
        static string connectionString = Properties.Settings.Default.DBConnection.ToString();

        //declare the db connection
        static OleDbConnection con = new OleDbConnection(connectionString);

        /// <summary>
        /// To Execute queries which returns result set (table / relation)
        /// </summary>
        /// <param name="query">the query string</param>
        /// <returns></returns>
        public static DataTable ExecuteDataTable(string query)
        {

            try
            {
                con.Open();
                OleDbCommand command = new OleDbCommand(query, con);
                System.Data.OleDb.OleDbDataAdapter tableAdapter = new System.Data.OleDb.OleDbDataAdapter(command);
                DataTable dt = new DataTable();
                tableAdapter.Fill(dt);
                return dt;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            con.Close();
        }
    }

    /// <summary>
    /// To Execute update / insert / delete queries
    /// </summary>
    /// <param name="query">the query string</param>
    public static void ExecuteNonQuery(string query)
    {
        try
        {
            con.Open();
            System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(query, con);
            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            con.Close();
        }
    }

    /// <summary>
    /// To Execute queries which return scalar value
    /// </summary>
    /// <param name="query">the query string</param>
    public static object ExecuteScalar(string query)
    {
        try
        {
            con.Open();
            System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(query, con);  /// here is the Excaption !!!!!!!!!
            return command.ExecuteScalar();
        }
        catch
        {
            throw;
        }
        finally
        {
            con.Close();
        }
    }

}
}

****************************************************************************


****************************************************************************
DataQueries.cs
****************************************************************************
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace Yad2
{
    class DataQueries
    {

        public static DataTable GetAllItems()
        {
            try
            {
                string query = "Select * from Messages";

                DataTable dt = AdoHelper.ExecuteDataTable(query);

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


        public static void AddNewItem(string mesNumber, string title , string mesDate , string contactMail , string mesType , string Details )
        {
            string query = "Insert into Messages values(" + mesNumber + " , '" + title + "' , '" + mesDate + "' , '" + contactMail + "' , , '" + mesType + "' , '" + Details + "')";
            AdoHelper.ExecuteNonQuery(query);
       }

        public static void DeleteDept(int mesNumber)
        {
            string query = "Delete from Item where MessageNumber=" + mesNumber;
            AdoHelper.ExecuteNonQuery(query);
        }
    }
}
***********************************************************************************************

Почему происходит сбой программы?

Ответы [ 4 ]

4 голосов
/ 22 декабря 2010

Попробуйте это

INSERT INTO table (column1, column2, ...)
VALUES ('value1', 'value2', ...)
4 голосов
/ 22 декабря 2010

Когда вы помещаете вашу строку в SQL, вы получаете неверный синтаксис.
Это произойдет, если одна из строк содержит '.

Вам нужно использовать параметры.

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

1 голос
/ 22 декабря 2010
string query = "Insert into Messages values(" + mesNumber + " , '" + title + "' , '" + mesDate + "' , '" + contactMail + "' , , '" + mesType + "' , '" + Details + "')";

выходы

Insert into Messages
values(
    <number> , 
    '<title>' , 
    '<mesDate>' , 
    '<contactMail>' , , 
    '<mesType>' , 
    '<Details>'
)

Обратите внимание на две запятые с пробелом между ними. Это не допустимый SQL. У вас также будет неверный запрос, если mesNumber является нулевым значением в вашем коде.

Как прокомментировал Джо Уайт со ссылкой на XKCD # 327, всегда очищает входные данные вашей базы данных! Это означает, что если в ваш метод передана строка, вы должны экранировать все одинарные кавычки.

Как прокомментировал SLaks, никогда не используйте throw ex;, просто используйте throw;

0 голосов
/ 22 декабря 2010

Почему бы вам просто не распечатать значение query (в окно отладки, консоль, окно сообщения, файл журнала ... где угодно!) В AddNewItem, а затем просмотреть сообщение.Это действительно должно стать ясно тогда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...