Как отобразить данные «текущего пользователя»? - PullRequest
3 голосов
/ 07 мая 2019

Я учусь в старшей школе, которая все еще новичок в C #.

Я делаю систему управления библиотекой (для книг), которая включает в себя базу данных (sql local database в visual studio (?)) Для пользователей.У меня есть форма, в которой пользователи могут просматривать данные, которые они вводят в форме регистрации (идентификатор пользователя, имя, имя пользователя, курс, раздел).Единственная проблема заключается в том, что он отображает только данные первого созданного аккаунта.Независимо от того, сколько других аккаунтов я создаю, все равно отображается только первый аккаунт.Как сделать так, чтобы отображались данные «текущего» пользователя / учетной записи, вошедшей в систему?

Я попытался слегка изменить код, изменив

SqlCommand cmd = conn.CreateCommand();
               cmd.CommandType = CommandType.Text;
               cmd.CommandText = "Select * from [tbl_accounts]";

на

string select = "Select * from [tbl_accounts]";
               SqlCommand cmd = new SqlCommand(select, conn);

Хотя, я думаю, они в основном одинаковы.Я действительно не знаю, что делать, так как другие решения, которые я нашел, намного сложнее.

Это код, который я использую сейчас:

try
{
   SqlConnection conn = new SqlConnection(@"[connection string]");
   conn.Open();

   string select = "Select * from [tbl_accounts]";
   SqlCommand cmd = new SqlCommand(select, conn);
   SqlDataReader dr = cmd.ExecuteReader();

   if(dr.Read())
   {
       materialLabel6.Text = dr["accountID"].ToString();
       materialLabel7.Text = dr["username"].ToString();
       materialLabel8.Text = dr["name"].ToString();
       materialLabel9.Text = dr["strand"].ToString();
       materialLabel10.Text = dr["section"].ToString();
   }

}
catch (Exception ex)
{ 
   MessageBox.Show(ex.Message);}      
}

Результатчто я хотел бы видеть, например:

Пользователи (таблица):

  1. PersonA
  2. PersonB

В настоящее время вошли в систему: PersonB

[PERSONB'S DATA]

Таким образом, это означает, что форма будет отображать только данные PersonB вместо PersonA

1 Ответ

4 голосов
/ 07 мая 2019

Для начала, если вам нужно более одной строки данных, вы захотите перебрать все строки в считывателе данных. Прямо сейчас вы получаете только первый ряд. Эта ссылка должна содержать соответствующую информацию для этого. Тем не менее, в идеале, вы хотите отправить параметр из пользовательского интерфейса (или что-то еще, что вы используете для запуска вызова функции), который обозначает пользователя (идентификатор или любое уникальное поле в таблице Users) и отправьте это в предложение where запроса sql, чтобы вы извлекли только те записи, которые вам нужны.

Запрос должен выглядеть примерно так:

public void GetUserInfo(int userId) // though you might want to change the parameter to suit your needs. It's hard to tell without being able to see the schema
{
    string select = string.Format("Select * from [tbl_accounts] where Id = {0}", userId.ToString()); // something along these lines
    SqlCommand cmd = new SqlCommand(select, conn);

    SqlDataReader dr = cmd.ExecuteReader();

    if(dr.Read())
    {         
        materialLabel6.Text = dr["accountID"].ToString();
        materialLabel7.Text = dr["username"].ToString();
        materialLabel8.Text = dr["name"].ToString();
        materialLabel9.Text = dr["strand"].ToString();
        materialLabel10.Text = dr["section"].ToString();
    }
}

Редактировать: быстрая заметка, если вы настроите свой запрос так, чтобы он извлекал одну запись на основе параметра, вам не нужно выполнять цикл.

Еще одно быстрое редактирование: я разбил код, чтобы он стал немного более читабельным. Это скорее «идеальная реализация» и обеспечивает применение некоторых лучших практик для кода. (Я знаю, что это проект для средней школы, но лучше всего привыкнуть разбивать код, поэтому он более универсален на ранних этапах работы с imo. В основном это для удобства сопровождения. В более крупных проектах сложно все так тесно связать вместе.)

public User GetUserInfo(int userId) // though you might want to change the parameter to suit your needs. It's hard to tell without being able to see the schema for the user table
{

    SqlConnection conn = new SqlConnection(@"[connection string]");
    conn.Open();

    string select = string.Format("Select * from [tbl_accounts] where Id = {0}", userId.ToString()); // something along these lines
    SqlCommand cmd = new SqlCommand(select, conn);

    SqlDataReader dr = cmd.ExecuteReader();

    User user = new User();

    if(dr.Read())
    {   
        user.AccountId = dr["accountID"].ToString();
        user.UserName = dr["username"].ToString();
        user.Name = dr["name"].ToString();
        user.Strand = dr["strand"].ToString();
        user.Section = dr["section"].ToString();
    }
    return user;
}

public void SetValues(User user) 
{
    materialLabel6.Text = user.AccountId;
    materialLabel7.Text = user.UserName;
    materialLabel8.Text = user.Name;
    materialLabel9.Text = user.Strand;
    materialLabel10.Text = user.Section;
}


public class User 
{
    string AccountId { get; set; }
    string UserName { get; set; }
    string Name { get; set; }
    string Strand { get; set; }
    string Section { get; set; }
}
...