这个函数,这就是我用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列。在这种情况下,没有2个用户名或密码是相同的,所以我不需要在WHERE子句中使用userID和密码。
答案 0 :(得分:1)
根据MSDN documentation,OleDbCommand
不支持命名参数:
OLE DB .NET提供程序不支持传递的命名参数 SQL语句或由a调用的存储过程的参数 CommandType设置为Text时的OleDbCommand。在这种情况下, 必须使用问号(?)占位符。
因此,请将查询文字更改为:
string stmt = "UPDATE tblUsers SET Locked = ? WHERE tblUsers.UserID = ?";
您还必须将要添加参数的顺序切换到命令。由于参数未命名,因此它们按照SQL语句中列出的顺序进行处理。因此,Locked
的参数必须是第一个,然后是UserID
。
答案 1 :(得分:1)
如果您使用的是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