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和密码。

MS Access数据库是/否未正确更新.函数的

如果使用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