我正在尝试更新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();
Run Code Online (Sandbox Code Playgroud)
在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();
Run Code Online (Sandbox Code Playgroud)
最后确保类型正确,传入的类型必须与数据库中的类型匹配.因此,如果count两个地方都是一个int,那么传递count而不是count.ToString()