Чтение пользователей из Access в список возвращает только одного пользователя - PullRequest
1 голос
/ 24 февраля 2012

Я работаю над приложением WPF в C # с VS 2010 SP1.

Я рассмотрел довольно много примеров здесь и в других местах в Интернете, и мой код кажется правильным, но когда я пытаюсь прочитать строки из БД Access в класс, затем в ObservableCollection (я также пытался просто список), только один заканчивается в коллекции. Затем я пытаюсь отобразить список имен пользователей в ListBox, и, конечно, появляется только один пользователь в коллекции.

Я застрял на этом некоторое время. Любая помощь будет принята с благодарностью. Я надеюсь, что это что-то очень тривиальное, что я просто упускаю из виду.

Класс пользователя:

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";
OleDbConnection AccessConn = new OleDbConnection(s_ConnString);

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

OleDbCommand AccessCmd = new OleDbCommand(s_Query, AccessConn);
OleDbDataReader rdr;

AccessConn.Open();
rdr = AccessCmd.ExecuteReader();

// Collection of Users.
ObservableCollection<User> userList = new ObservableCollection<User>();

try
        {
            // Read each user from DB into a User instance, then add that instance to the userList.
            while(rdr.Read())
            {
                User newUser = new User();
                newUser.UserID = rdr.GetInt32(0);
                newUser.UserName = rdr.GetString(1);
                newUser.UserTitle = rdr.GetString(2);
                newUser.UserArea = rdr.GetString(3);

                userList.Add(newUser);
            }

        }

catch(Exception e)
        {
            //Update Statusbar
        }

// Close the DB connection.
rdr.Close();
AccessConn.Close();

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

1 Ответ

0 голосов
/ 25 февраля 2012

У меня было нечто подобное со мной, когда я обрабатывал соединение с базой данных аналогичным образом.

Дайте приведенный ниже код попробовать:

// 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);
        }
...