MS Access数据库是/否未正确更新.函数的
本文关键字:更新 函数 Access 数据库 MS | 更新日期: 2023-09-27 18:27:12
,这就是为什么我使用OleDbParamteres而不是OleDbCommands来执行此操作。我一直在stackoverflow上搜索各种帖子,似乎没有一个解决方案与我想要做的完全匹配。我的老师要求一定的格式(我知道很愚蠢),这就是我所拥有的。
public void UpdateUserLocked(string Path, string userID, bool lockAcc)
{
// Declare and Instantiate the OleDb connection using the access connection string and database path
OleDbConnection sqlConn = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" + Path + "");
sqlConn.Open();
// Declare and instantiate a new OleDbCommand
OleDbCommand oCommand = new OleDbCommand();
oCommand.Connection = sqlConn;
string stmt = "UPDATE tblUsers SET Locked = @lockAcc WHERE (tblUsers.UserID = @id)";
//Declare new OleDbParameter for later use
OleDbParameter param;
// Instantiate a new parameter to be used later
param = new OleDbParameter();
//Create user id paramater
param = new OleDbParameter();
param.ParameterName = "@id";
param.Value = userID;
oCommand.Parameters.Add(param);
//Create locked parameter
param = new OleDbParameter();
param.ParameterName = "@lockAcc";
param.Value = lockAcc;
oCommand.Parameters.Add(param);
// Exectute the sql statement
oCommand.CommandText = stmt;
oCommand.CommandType = CommandType.Text;
oCommand.ExecuteNonQuery();
// Close the sql connection
sqlConn.Close();
}
当有人登录失败3次时,会调用该函数,并且执行良好。然而,数据库实际上并没有得到更新。数据库有一个ID、UserID、UserPassword和Locked列。在这种情况下,没有两个用户名或密码是相同的,所以我不需要在WHERE子句中使用userID和密码。
如果使用OleDbCommand
而不是SqlCommand
,则不能使用命名参数。
例如,将查询文本更改为:
string stmt = "UPDATE dbo.tblUsers SET Locked = ? WHERE (dbo.tblUsers.UserID = ?)";
现在你的参数必须按照问号的顺序:
//Create locked parameter
param = new OleDbParameter();
param.Value = lockAcc;
oCommand.Parameters.Add(param);
//Create user id paramater
param = new OleDbParameter();
param.Value = userID;
oCommand.Parameters.Add(param);
或者,您可以切换为使用SqlConnnection
而不是OleDbConnection
,并按照最初的计划继续(使用命名参数)。
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters(v=vs.110).aspx
根据MSDN文档,OleDbCommand
不支持命名参数:
OLE DB.NET提供程序不支持用于传递的命名参数SQL语句或由调用的存储过程的参数当CommandType设置为Text时使用OleDbCommand。在这种情况下必须使用问号(?)占位符。
因此,将您的查询文本更改为:
string stmt = "UPDATE tblUsers SET Locked = ? WHERE tblUsers.UserID = ?";
您还必须切换将参数添加到命令中的顺序。因为这些参数没有命名,所以按照它们在SQL语句中列出的顺序进行处理。因此,Locked
的参数必须是第一个,然后是UserID
。