C#/accdb:获取错误“;操作必须使用可更新的查询。”;

C#/accdb:获取错误“;操作必须使用可更新的查询。”;,c#,sql,.net,ms-access,C#,Sql,.net,Ms Access,我正在用C#编写一个连接到MS Access数据库(.accdb)的应用程序。该应用程序将由多个工作人员使用,他们中的每一个人都将不时连接到数据库,以刷新他们的状态(及时刷新登录) 连接到同一数据库的所有其他函数似乎都可以正常工作,但这一个不行。由于某种原因,我得到了下面的错误,它说问题出在我的ExecuteNonQuery()所在的行中。命令文本由字符串myUpdateNonquery定义 职能: public Boolean RefreshSignIn() { Boolean succe

我正在用C#编写一个连接到MS Access数据库(.accdb)的应用程序。该应用程序将由多个工作人员使用,他们中的每一个人都将不时连接到数据库,以刷新他们的状态(及时刷新登录)

连接到同一数据库的所有其他函数似乎都可以正常工作,但这一个不行。由于某种原因,我得到了下面的错误,它说问题出在我的
ExecuteNonQuery()
所在的行中。命令文本由字符串myUpdateNonquery定义

职能:

public Boolean RefreshSignIn()
{
  Boolean successful = false;
  lock(dbLock)
  {
    try
    {
      string myConnectionString = connectionType + primarydbPath;
      OleDbConnection myConnection = new OleDbConnection(myConnectionString);
      string myUpdateNonquery = "UPDATE AgentSignIn SET signInTime = NOW() WHERE agentName = @p1";
      using(myConnection)
      {
        OleDbCommand myCommand = new OleDbCommand(myUpdateNonquery, myConnection);
        using(myCommand)
        {
          myCommand.Parameters.Add("@p1", OleDbType.Char).Value = appSettings.mynick;

          myConnection.Open();
          int updatedRows = myCommand.ExecuteNonQuery();
          if (updatedRows>0) {successful = true;}
        }
      }
    }
    catch(System.Exception ex)
    {
      MessageBox.Show("Error! Failed to keep you signed in to the database!\n\n"+ex.ToString());
    }
  }
  return successful;
}

SQL看起来不错。这似乎是一个权限问题,下面的文章概述了如何解决此问题:


但是使用UPDATE命令的其他方法也可以工作,并且不会告诉我错误。这就是让我困惑的原因。在access中,在AgentSignIn表中创建一个测试行,然后创建一个新查询并执行以下操作:UPDATE AgentSignIn SET signInTime=NOW(),其中agentName='TestRow',如果执行该操作,则可能是以下行:OleDbType.Char)。Value=appSettings.mynick;数据类型char只接受1个字符(不是字符串),您可能必须将其更改为:OleDbType.VarChar).Value=appSettings.mynick;我对你链接下的文章进行了权限更改。似乎它已经正确保存用户名并及时刷新登录。但现在我在另一种方法中遇到了另一个错误(注销其他非活动用户)。错误为:
System.Data.OleDb.OleDbException(0x80004005):无法使用“xxxxxxxx.accdb”;文件已在使用。
看起来另一个进程正在访问数据库文件并将您锁定。人们使用不同于Access的RDM(提供更好的并发性)的主要原因之一。您是否尝试了测试行解决方案?@ValCool用户是否对Access数据库所在的文件夹拥有完全权限?Access会创建一个锁文件(.ldb),用户至少需要读/写权限。可能存在重复的
public Boolean RefreshSignIn()
{
  Boolean successful = false;
  lock(dbLock)
  {
    try
    {
      string myConnectionString = connectionType + primarydbPath;
      OleDbConnection myConnection = new OleDbConnection(myConnectionString);
      string myUpdateNonquery = "UPDATE AgentSignIn SET signInTime = NOW() WHERE agentName = @p1";
      using(myConnection)
      {
        OleDbCommand myCommand = new OleDbCommand(myUpdateNonquery, myConnection);
        using(myCommand)
        {
          myCommand.Parameters.Add("@p1", OleDbType.Char).Value = appSettings.mynick;

          myConnection.Open();
          int updatedRows = myCommand.ExecuteNonQuery();
          if (updatedRows>0) {successful = true;}
        }
      }
    }
    catch(System.Exception ex)
    {
      MessageBox.Show("Error! Failed to keep you signed in to the database!\n\n"+ex.ToString());
    }
  }
  return successful;
}