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

时间:2014-10-19 05:34:19

标签: c# .net database

这个函数,这就是我用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和密码。

2 个答案:

答案 0 :(得分:1)

根据MSDN documentationOleDbCommand不支持命名参数:

  

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