Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将用户从Access读取到列表中只返回一个用户_C#_Wpf_List_Ms Access_Oledbdatareader - Fatal编程技术网

C# 将用户从Access读取到列表中只返回一个用户

C# 将用户从Access读取到列表中只返回一个用户,c#,wpf,list,ms-access,oledbdatareader,C#,Wpf,List,Ms Access,Oledbdatareader,我正在用VS2010SP1开发C中的WPF应用程序 我在这里和网上的其他地方看了很多例子,我的代码似乎是正确的,但是当我试图将Access DB中的行读入一个类,然后读入一个ObservableCollection时,我也只尝试了一个列表,在集合中只有一个。然后,我尝试在列表框中显示用户名列表,当然,只会显示集合中的一个用户 我已经在这上面呆了一段时间了。任何帮助都将不胜感激。我希望这是一件非常琐碎的事情,我只是忽略了 用户类别: public class User { public U

我正在用VS2010SP1开发C中的WPF应用程序

我在这里和网上的其他地方看了很多例子,我的代码似乎是正确的,但是当我试图将Access DB中的行读入一个类,然后读入一个ObservableCollection时,我也只尝试了一个列表,在集合中只有一个。然后,我尝试在列表框中显示用户名列表,当然,只会显示集合中的一个用户

我已经在这上面呆了一段时间了。任何帮助都将不胜感激。我希望这是一件非常琐碎的事情,我只是忽略了

用户类别:

public class User
{
    public User() { }
    public int UserID { get; set; }
    public string UserName { get; set; }
    public string UserTitle { get; set; }
    public string UserArea { get; set; }
}
代码:


当我以类似的方式处理数据库连接时,也发生了类似的事情

请尝试以下代码:

// Setting up DB stuff.
        string s_ConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data " +
            "Source=|DataDirectory|\\CloseoutApp.accdb";

        string s_Query = "SELECT UserID, UserName, UserTitle, UserArea FROM Users " +
            "ORDER BY UserID;";

        ObservableCollection<User> userList = new ObservableCollection<User>();

        using (OleDbConnection AccessConn = new OleDbConnection(s_ConnString))
        {
            using (OleDbCommand AccessCmd = AccessConn.CreateCommand())
            {
                AccessCmd.CommandText = s_Query;

                try
                {
                    AccessConn.Open();

                    OleDbDataReader rdr = AccessCmd.ExecuteReader();

                    while (rdr.Read())
                    {
                        User newUser = new User();
                        newUser.UserID = rdr.GetInt32(0);
                        newUser.UserName = rdr.GetValue(1).ToString();
                        newUser.UserTitle = rdr.GetValue(2).ToString();
                        newUser.UserArea = rdr.GetValue(3).ToString();

                        userList.Add(newUser);
                    }

                    rdr.Close();

                }
                catch(Exception ex)
                {
                    //do something with ex
                }

            }

        }

        // Add users to the ListBox.
        foreach (User u in userList)
        {
            lb_Users.Items.Add(u.UserName);
        }

尝试了一下,得到了同样的精确结果。通过调试也确认userList只有一个条目。@Ashton我在while循环中做了一个调整。针对这些空值尝试一下,看看在GetValue上调用ToString是否能更好地处理空值问题我假设表中有多个用户?我放弃了我的答案,因为它不能解决你的问题。如果需要添加其他内容,我会将其添加回调试器中,如果您在调试器中单步执行,是否看到rdr.Read第一次返回true,第二次返回false,即循环只执行一次?在catch块中是否捕获了任何异常?如果将try…catch移动到循环内部,根据//Update Statusbar的操作,不确定这是否有意义?请尝试直接在Access中运行SQL,以确保获得预期的结果。@DanNewhouse-是的,表中有三个测试用户。@Ashton Cool,我想应该是>1,但你永远不知道;
// Setting up DB stuff.
        string s_ConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data " +
            "Source=|DataDirectory|\\CloseoutApp.accdb";

        string s_Query = "SELECT UserID, UserName, UserTitle, UserArea FROM Users " +
            "ORDER BY UserID;";

        ObservableCollection<User> userList = new ObservableCollection<User>();

        using (OleDbConnection AccessConn = new OleDbConnection(s_ConnString))
        {
            using (OleDbCommand AccessCmd = AccessConn.CreateCommand())
            {
                AccessCmd.CommandText = s_Query;

                try
                {
                    AccessConn.Open();

                    OleDbDataReader rdr = AccessCmd.ExecuteReader();

                    while (rdr.Read())
                    {
                        User newUser = new User();
                        newUser.UserID = rdr.GetInt32(0);
                        newUser.UserName = rdr.GetValue(1).ToString();
                        newUser.UserTitle = rdr.GetValue(2).ToString();
                        newUser.UserArea = rdr.GetValue(3).ToString();

                        userList.Add(newUser);
                    }

                    rdr.Close();

                }
                catch(Exception ex)
                {
                    //do something with ex
                }

            }

        }

        // Add users to the ListBox.
        foreach (User u in userList)
        {
            lb_Users.Items.Add(u.UserName);
        }