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 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();
}
}
这应该有助于您解决问题。
public static void UpdateData(string keyName,string colName,string data)
{
using (OleDbConnection connection = 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);
connection.Open();
string commandString = String.Format("UPDATE [DataSet$] SET colName ='{0}' WHERE keyName = '{1}'",@data,@keyName);
OleDbCommand cmd = new OleDbCommand(commandString, connection);
cmd.Parameters.AddWithValue("@data", data);
cmd.Parameters.AddWithValue("@keyName", keyName);
connection.Close();
connection.Dispose();
}
}
}
您需要遵循与我的答案相同的方法。使用string.format填充列名和命令参数以填充值。 –
这里的关键字是什么?这是一个专栏名称?那么你也需要有价值。你能解释一下你需要这样做的用例吗?您的这段代码与您的第一段代码有相同的问题。 –
你能分享keyname,colname和数据的样本值吗? –
- 1. 查询表达式中的语法错误(缺少运算符)
- 2. 查询表达式中的语法错误(缺少运算符)?
- 3. 查询表达式中的语法错误(缺少运算符)
- 4. 错误消息:在查询表达式语法错误(缺少操作员)
- 5. MySQL查询中的语法错误(缺少运算符)
- 6. MS-Access查询中的语法错误(缺少运算符)
- 7. 运行时错误'3075':查询表达式中的语法错误(缺少运算符)'[Order Number] ='
- 8. 我收到一个错误:vb中查询表达式中的语法错误(缺少运算符)
- 9. SQL语法错误:缺少运算符
- 10. 语法错误(缺少运算符)查询
- 11. ms访问宏构建器中的查询表达式中的语法错误(缺少运算符)
- 12. 表达式中缺少运算符
- 13. [OleDbException(0x80040e14):查询表达式'PCName = <%#Eval('PCName')%>'中的语法错误(缺少运算符)。]
- 14. SSMS:Oracle错误消息:缺少表达
- 15. 查询中的语法错误(缺少运算符)带括号的FROM子句
- 16. 缺少运算符在查询表达式
- 17. MS-访问:语法错误缺少运营商在查询表达式:
- 18. 在SQL查询中缺少运算符
- 19. 在vb.net中INSERT语法错误(缺少运算符)fform
- 20. 运行时错误“-2147217900(80040E14)”错误的语法时才(缺少操作室),在SQL查询表达式在VBA
- 21. 语法错误(缺少操作员)在查询表达式 - MS-访问
- 22. 语法错误(缺少操作员)在查询表达式“@ID = @@ IDENTITY”
- 23. OleDbException是未处理:语法错误(缺少操作员)在查询表达式
- 24. 语法错误(缺少操作员)在查询表达式 '@ID = @@ IDENTITY' II
- 25. 带通配符的查询表达式中的语法错误
- 26. VBA - 缺少运算符SQL查询错误
- 27. Ole db查询错误缺少运算符
- 28. MS Access语法错误(缺少运算符)
- 29. 使用BETWEEN运算符的SQL查询会导致“查询表达式中的语法错误”
- 30. 运算符的语法表达式
我不知道你在问什么,但请注意,代码因为它是容易受到SQL注入攻击。 – AKX
我无法将数据插入到工作表中,并且抛出了上述异常。 – darsi567
我是新来的C#和SQL。任何人都可以帮助解决上述语法错误? – darsi567