2014-10-19 129 views
0

的功能,這就是爲什麼我用OleDbParamteres而不是OleDbCommands。我一直在搜索stackoverflow上的各種帖子,沒有一個解決方案看起來與我正在嘗試做的完全一致。我的老師需要一定的格式(我知道的愚蠢),這是我的。MS Access數據庫是/否沒有正確更新

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子句中使用用戶標識和密碼。

回答

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

+0

謝謝!這解決了我的問題,現在一切正常! – xCasper 2014-10-19 06:19:10

1

按照MSDN documentation,該OleDbCommand不支持命名參數:

的OLE DB .NET提供程序不支持命名參數傳遞 參數的SQL語句或由 調用的存儲過程當CommandType設置爲Text時,OleDbCommand。在這種情況下,必須使用 問號(?)佔位符。

因此改變你的查詢文本:

string stmt = "UPDATE tblUsers SET Locked = ? WHERE tblUsers.UserID = ?"; 

您還必須進行切換,你所添加的參數,該命令的順序。由於這些參數未命名,因此將按照它們在SQL語句中列出的順序進行處理。因此Locked的參數必須是第一個,然後是UserID