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