C# INSERT INTO语句中的语法错误

C# INSERT INTO语句中的语法错误,c#,sql,C#,Sql,我写了一个连接到MS Access的程序。当我填写字段并添加新项以访问程序时,程序失败。例外情况是“INSERT INTO语句中的语法错误” 这是相关代码 **************************************************************** AdoHelper.cs **************************************************************** using System; using System.C

我写了一个连接到MS 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);
        }
    }
}
***********************************************************************************************
****************************************************************
AdoHelper.cs
****************************************************************
使用制度;
使用System.Collections.Generic;
使用系统文本;
使用系统数据;
使用System.Data.OleDb;
名称空间Yad2
{
类帮助器
{
//从app.config文件获取连接字符串
//Provider=Microsoft.ACE.OLEDB.12.0;数据源=| DataDirectory |\Yad2.accdb
静态字符串connectionString=Properties.Settings.Default.DBConnection.ToString();
//声明数据库连接
静态OLEDB连接con=新OLEDB连接(connectionString);
/// 
///执行返回结果集(表/关系)的查询
/// 
///查询字符串
/// 
公共静态数据表ExecuteDataTable(字符串查询)
{
尝试
{
con.Open();
OleDbCommand命令=新的OleDbCommand(查询,con);
System.Data.OleDb.OleDbDataAdapter tableAdapter=新的System.Data.OleDb.OleDbDataAdapter(命令);
DataTable dt=新的DataTable();
表1.Fill(dt);
返回dt;
}
捕获(例外情况除外)
{
掷骰子;
}
最后
{
con.Close();
}
}
/// 
///执行更新/插入/删除查询
/// 
///查询字符串
公共静态void ExecuteNonQuery(字符串查询)
{
尝试
{
con.Open();
System.Data.OleDb.OleDbCommand命令=新的System.Data.OleDb.OleDbCommand(查询,con);
command.ExecuteNonQuery();
}
捕获(例外情况除外)
{
掷骰子;
}
最后
{
con.Close();
}
}
/// 
///执行返回标量值的查询
/// 
///查询字符串
公共静态对象ExecuteScalar(字符串查询)
{
尝试
{
con.Open();
System.Data.OleDb.OleDbCommand命令=新的System.Data.OleDb.OleDbCommand(query,con);///这里是例外!!!!!!!!!
return命令。ExecuteScalar();
}
抓住
{
投掷;
}
最后
{
con.Close();
}
}
}
}
****************************************************************************
****************************************************************************
dataquerys.cs
****************************************************************************
使用制度;
使用System.Collections.Generic;
使用系统文本;
使用系统数据;
名称空间Yad2
{
类数据查询
{
公共静态数据表GetAllItems()
{
尝试
{
string query=“从消息中选择*”;
DataTable dt=AdoHelper.ExecuteDataTable(查询);
返回dt;
}
捕获(例外情况除外)
{
掷骰子;
}
}
公共静态void AddNewItem(字符串mesNumber、字符串title、字符串mesDate、字符串contactMail、字符串mesType、字符串详细信息)
{
string query=“插入消息值(“+mesNumber+”、“+title+”、“+mesDate+”、“+contactMail+”、“+mesType+”、“+Details+”)”);
adoheloper.ExecuteNonQuery(查询);
}
公共静态无效删除部门(int mesNumber)
{
string query=“从项目中删除,其中MessageNumber=“+mesNumber;
adoheloper.ExecuteNonQuery(查询);
}
}
}
***********************************************************************************************

为什么程序会失败?

将字符串放入SQL时,得到的语法无效。
如果其中一个字符串包含
,则会发生这种情况

您需要使用参数


此外,您的SQL包含无效语法的

为什么不在
AddNewItem
中打印
query
的值(到调试窗口、控制台、消息框、日志文件…任何地方!),然后检查消息。那真的应该很清楚了。

试试这个

INSERT INTO table (column1, column2, ...)
VALUES ('value1', 'value2', ...)
屈服

Insert into Messages
values(
    <number> , 
    '<title>' , 
    '<mesDate>' , 
    '<contactMail>' , , 
    '<mesType>' , 
    '<Details>'
)
插入到消息中
价值观(
, 
'' , 
'' , 
'' , 
'' , 
''
)
注意后面的两个逗号,它们之间有一个空格。这不是有效的SQL。如果
mesNumber
在代码中为空值,则查询也会出错

正如Joe White在其指向XKCD#327的链接中所评论的那样,始终清理数据库输入!这意味着,如果将字符串传递给方法,则必须转义所有单引号


正如SLaks所评论的,永远不要使用
throw-ex
,只需使用
抛出

“程序图”?“进入”?“例外”?你应该使用拼写检查工具。@abelenky:对有些人来说,英语很难。因此,我们可以使用编辑按钮来帮助清理它。@Chris:ESL作者尤其应该使用拼写检查器。计算机负责拼写,所以我们不必这样做。我怀疑这是主要问题。在执行插入操作时,应明确定义所有列。否则,它很脆弱,当DDL发生变化时,很可能会爆炸;只需完全移除
catch
块。SLaks,你说得对极了,我从未意识到我们可以省略
catch
块。对于那些感兴趣的人,下面是微软对此的看法:“有三种可能的try语句形式:try块后跟一个或多个catch块。try块后跟finally块。try块后跟一个或多个mor
Insert into Messages
values(
    <number> , 
    '<title>' , 
    '<mesDate>' , 
    '<contactMail>' , , 
    '<mesType>' , 
    '<Details>'
)