我正在尝试更新MS-Access数据库中的值.
直接输入到Access时查询工作正常,但是当我尝试在C#中更新它时,我得到"UPDATE子句中的语法错误"异常.
conMngr.ConnectionStr = ConfigurationManager.ConnectionStrings[_connectionStr].ConnectionString; conMngr.OpenConnection(); try { string query = "select Id, counter from tabAppCounter where userId=" + _userId.ToString() + " and appPath = '" + path + "'"; OleDbDataAdapter adapter = new OleDbDataAdapter(query, conMngr.DbCon); DataSet ds = new DataSet(); adapter.Fill(ds); dataGridView.DataSource = ds.Tables[0]; if (ds.Tables[0].Rows.Count != 0) { int count = int.Parse(ds.Tables[0].Rows[0].ItemArray[1].ToString())+ 1; string query2 = "UPDATE tabAppCounter set counter=@count where Id=@Id"; conMngr.OleDbcmd = new OleDbCommand(query2, conMngr.DbCon); conMngr.OleDbcmd.Parameters.AddWithValue("@Id", ds.Tables[0].Rows[0].ItemArray[0].ToString()); conMngr.OleDbcmd.Parameters.AddWithValue("@count", count.ToString()); conMngr.OleDbcmd.ExecuteNonQuery(); } } catch (Exception e) { MessageBox.Show(e.Message + "\n\n" + e.StackTrace); } conMngr.CloseConnection();
在ExecuteNonQuery之后,此代码失败,并在UPDATE子句异常中出现语法错误.
我已经尝试使用预建的查询字符串,但这也不起作用.
访问驱动程序(和Ole)不使用命名参数,它们是基于位置的.传递参数的顺序和更新语句中的参数不匹配,这会给您一个错误.
你真的应该?
在更新字符串中使用占位符.
string query2 = "UPDATE tabAppCounter set counter=? where Id=?"; conMngr.OleDbcmd = new OleDbCommand(query2, conMngr.DbCon); conMngr.OleDbcmd.Parameters.AddWithValue("@count", count.ToString()); conMngr.OleDbcmd.Parameters.AddWithValue("@Id", ds.Tables[0].Rows[0].ItemArray[0].ToString()); conMngr.OleDbcmd.ExecuteNonQuery();
最后确保类型正确,传入的类型必须与数据库中的类型匹配.因此,如果count
两个地方都是一个int,那么传递count
而不是count.ToString()