C#OleDbDataReader:参数查询无法检索数据

时间:2015-02-03 14:22:07

标签: c# parameters oledb oledbcommand oledbdatareader

我正在开发一个从数据库(MS Access)读取用户数据的应用程序,并将信息设置为变量。 sql命令接受一个参数来检查数据库的用户名,但是OleDbDataReader显示为空(userData.HasRows)。

public void UpdatePage(string Username)
    { 
        OleDbDataReader userData;
        string sqlCmd = "SELECT * FROM [Profile Data] WHERE Username = ?";

        TabPage profile = new TabPage();

        using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source = LogIn Profiles.accdb;"))
        {
            OleDbCommand cmd = new OleDbCommand(sqlCmd, conn);

            cmd.Parameters.AddWithValue("@Username", Username);

            try
            {
                conn.Open();
                userData = cmd.ExecuteReader();

                if(userData.HasRows)
                {
                    //Used for debugging
                }

                while (userData.Read()) //is not entering into the loop
                {
                    userID = userData[0].ToString();
                    username = userData[1].ToString();
                    password = userData[2].ToString();
                    country = userData[3].ToString();
                    occupation = userData[4].ToString();
                    gender = userData[5].ToString();
                }
                userData.Close();
            }
            catch
            {
                MessageBox.Show("Error 3: Error to connect to database", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        } 

当我删除参数并将sqlCmd设置为在数据库中具有集合名称(“... WHERE Username ='Mitchell'”;)时,则输入while循环并分配变量。真棒。所以参数发生了一些事情。

此外,我已经确认在调用此方法之前用户数据位于数据库中,因此应该找到它。

2 个答案:

答案 0 :(得分:0)

根据我的记忆,访问不支持命名参数,并使用" @ parm"在哪里" parm"与您打算更新的列名称相同,可能会暗示......

set ColumnA = ColumnA

vs您实际提供的参数。 "?"你是否正确充当参数的序数占位符,所以我只想尝试从

改变
"@Username" to just "parmUserName"

不要使用" @"登录

答案 1 :(得分:0)

因此,经过几个小时的游戏后我找到了解决方案,但是我并不完全确定它为什么会起作用。我不得不将OleDbConnection的数据源更改为直接文件路径,而不是相对路径。

在此方法之前是另一个将数据插入数据库的方法,并且只有在程序关闭后才能使用此UpdatePage方法访问它。不完全确定原因,但我也必须在其他方法中使用完整地址。