C# 消息:System.Data.OleDb.OLEDBEException:查询表达式中出现语法错误(缺少运算符)

C# 消息:System.Data.OleDb.OLEDBEException:查询表达式中出现语法错误(缺少运算符),c#,oledbconnection,C#,Oledbconnection,您试图做的是混合动态查询生成和查询参数。 不能使用命令参数填充查询中的列名。参数仅用于向查询传递值 public static void WriteData(string colName,string data) { using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Constants.FileName + ";Extended Prope

您试图做的是混合动态查询生成和查询参数。 不能使用命令参数填充查询中的列名。参数仅用于向查询传递值

public static void WriteData(string colName,string data)
{
    using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Constants.FileName + ";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=3;READONLY=FALSE\""))
    {
        // string query = String.Format("INSERT INTO  [DataSet$]({0}) VALUES ({1})",colName, data);

        string query = String.Format("INSERT INTO  [DataSet$]({0}) VALUES ({1})", colName, data);
        cn.Open();
        OleDbCommand cmd = new OleDbCommand(query, cn);
        cmd.Parameters.AddWithValue("@colName", colName);
        cmd.Parameters.AddWithValue("@data", data);

        cmd.ExecuteNonQuery();
        cn.Close();
        cn.Dispose();
    }
}
因此,您需要做的是,仅使用
string.Format
将列名放置在查询中,并仅使用命令参数将数据传递给查询

public static void WriteData(string colName,string data)
{
    using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Constants.FileName + ";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=3;READONLY=FALSE\""))
    {
        // string query = String.Format("INSERT INTO  [DataSet$]({0}) VALUES ({1})",colName, data);

        string query = String.Format("INSERT INTO  [DataSet$]({0}) VALUES ({1})", colName, data);
        cn.Open();
        OleDbCommand cmd = new OleDbCommand(query, cn);
        cmd.Parameters.AddWithValue("@colName", colName);
        cmd.Parameters.AddWithValue("@data", data);

        cmd.ExecuteNonQuery();
        cn.Close();
        cn.Dispose();
    }
}

这将帮助您解决问题。

我不知道您在问什么,但请注意,代码容易受到SQL注入攻击。我无法将数据插入工作表,它会引发上述异常。我对c#和SQL不熟悉。请任何人帮助解决上述语法错误??您能调试代码并检查分配给
query
的值并在此处共享吗?哪些值分配给
colName
data
变量?您真的将表命名为“DataSet$”吗?给它一个真实的名字,没有任何符号。您的Insert查询没有什么意义:您正试图将一段数据插入到潜在的多个列中的一列中?谢谢您的回复。您能告诉我如何更新表格吗?表格包含要插入的行名、列名和数据。这里的行名是什么?您有多个列要更新?你已经试过一些代码了吗?此解决方案对插入操作有效吗?您需要遵循与我的答案相同的方法。使用string.format填充列名,使用命令参数填充值。此处的键名是什么?是列名吗?那么你也需要有价值。你能解释一下你需要这样做的用例吗?你的这段代码与你的第一段代码有相同的问题。你能分享keyname、colname和data的示例值吗?我请求你在你的答案周围添加更多的上下文。仅链接的答案很难理解,并且可能会出现链接腐烂问题。如果你能在帖子中复制链接中最相关的部分,这将有助于提问者和未来的读者。
public void WriteData(string colName, string data)
{
    using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Constants.FileName + ";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=3;READONLY=FALSE\""))
    {
        string query = string.Format("INSERT INTO [DataSet$] ({0}) VALUES (@data)", colName);
        // The query variable will have following value assuming colName=token
        //INSERT INTO [DataSet$] (token) VALUES (@data)
        cn.Open();
        //Now use OleDbCommand to pass value of @data to the query.
        OleDbCommand cmd = new OleDbCommand(query, cn);
        cmd.Parameters.AddWithValue("@data", data);

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