C# UPDATE子句中的语法错误

C# UPDATE子句中的语法错误,c#,ms-access,C#,Ms Access,我正在尝试更新MS Access数据库中的值 当直接输入Access时,查询可以正常工作,但是当我尝试在C#中更新它时,会出现“update子句中的语法错误”异常 conMngr.ConnectionStr = ConfigurationManager.ConnectionStrings[_connectionStr].ConnectionString; conMngr.OpenConnection(); try { string query = "select Id, counter

我正在尝试更新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();
此代码在执行ExecuteOnQuery后失败,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();
我尝试过使用预构建的查询字符串,但这也不起作用

访问驱动程序(和Ole)不使用命名参数,它们是基于位置的。传递参数的顺序与update语句中的参数不匹配,这将导致错误

对于更新字符串中的占位符,确实应该使用

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()

访问驱动程序(和Ole)不使用命名参数,它们是基于位置的。传递参数的顺序与update语句中的参数不匹配,这将导致错误

对于更新字符串中的占位符,确实应该使用

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()

,希望这对其他人有所帮助:这对我来说是有效的

而不是

string query2 = "UPDATE tabAppCounter set counter=@count where Id=@Id";
我曾经

string query2 = "UPDATE [tabAppCounter] set [counter]=@count where [Id]=@Id";

神奇的是,一切都开始正常工作。

希望这对其他人有所帮助:这就是我的工作

而不是

string query2 = "UPDATE tabAppCounter set counter=@count where Id=@Id";
我曾经

string query2 = "UPDATE [tabAppCounter] set [counter]=@count where [Id]=@Id";

神奇的是,一切都开始正常工作。

是否有可能@count被视为字符串而不是数字?在将值直接写入查询之前,我使用了一个预构建的字符串。即使这样,它也不起作用……是否有可能@count被视为字符串而不是数字?在将值直接写入查询之前,我使用了一个预构建的字符串。即使在那时,它也不起作用……我做了这些改变。但是没有用:(@ty812-对不起,我在开会。看起来你已经搞定了。这与转义保留字有关,你可以使用
[]
括号(正如你在下面指出的)。请记住,我的答案中的上述信息仍然有效,并确保您的参数的顺序/添加方式与sql语句中的相同。我做了这些更改。但没有任何效果:(@ty812-抱歉,我正在开会。看起来您已经解决了。这与转义保留字有关,您可以使用
[]
括号(如您在下面指出的)。请记住,我的回答中的上述信息仍然正确,并确保您的参数的顺序/添加方式与sql语句中的相同。