Как отобразить данные текущего пользователя?

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

Я создаю систему управления библиотекой (для книг), которая включает базу данных (локальную базу данных sql в 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. ПерсонаA
  2. Человек Б

Сейчас вы вошли в систему: PersonB

[ДАННЫЕ ЛИЦА]

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


person Anonymousse    schedule 07.05.2019    source источник


Ответы (1)


Во-первых, если вам нужно более одной строки данных, вы захотите просмотреть все строки в средстве чтения данных. Прямо сейчас вы получаете только первую строку. Эта ссылка должна иметь соответствующую информацию для этого. Однако в идеале вы хотели бы отправить параметр из пользовательского интерфейса (или что-то еще, что вы используете для запуска вызова функции), который обозначает пользователя (идентификатор или любое уникальное поле в таблице пользователей) и отправьте это в предложение 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();
    }
}

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

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

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; }
}
person Dortimer    schedule 07.05.2019
comment
Могу я спросить, для чего нужен публичный класс? Извините, я еще не знаком с другими терминами... и спасибо! - person Anonymousse; 07.05.2019
comment
Без проблем. Это всего лишь пример функции, которая возвращает потенциальный класс, который вы могли бы назвать User. Лично я бы добавил этот класс и добавил членов для всех столбцов в таблице User, затем заполнил объект User результатами DataReader, а затем отправил объект обратно в пользовательский интерфейс, чтобы MaterialLabels могли быть установлены значениями этого объекта. - person Dortimer; 07.05.2019
comment
@Anonymousse Я обновил ответ и разделил два примера, чтобы он был немного понятнее и легче читался. - person Dortimer; 07.05.2019
comment
@Dortimer, чувак, ты дал имя переменной returnValue, но в Read() ты вводишь пользователя и возвращаешь пользователя. Не могли бы вы исправить это для более четкого кода. - person evilGenius; 07.05.2019
comment
@evilGenius моя ошибка. я довольно быстро набирала - person Dortimer; 07.05.2019
comment
@Dortimer все в порядке) я просто хотел улучшить твой ответ) - person evilGenius; 07.05.2019
comment
Являются ли строковые переменные в членах открытого класса User? Что делает функция Пользователь? А также есть ли сайт, который мог бы помочь мне с необходимым/важным жаргоном в программировании? Еще раз спасибо и прошу прощения за растущее количество вопросов. - person Anonymousse; 07.05.2019
comment
Класс User (public class User) должен иметь строки или переменные, соответствующие типам данных (string, int, double и т. д.) в таблице SQL, на которую вы ссылаетесь. Верхний блок кода во втором примере: public User GetUserInfo(int userId) — это метод, который принимает параметр для поиска данных пользователя по Id в базе данных и возвращает объект User. Если в базе данных нет столбца «Id», вам нужно изменить параметр, чтобы найти уникальные пользовательские данные (иногда методы называют функциями, но в наши дни «метод» более распространен, а термины «более-или» -less означает то же самое) - person Dortimer; 07.05.2019
comment
Кроме того, в идеале код public class User должен находиться в отдельном файле, а метод public User GetUserInfo(int userid) также должен находиться в отдельном файле. По сути, вы хотите разбить код, чтобы каждый файл служил определенной цели (определение класса, наличие методов для поиска и сохранения в базе данных и, в этом случае, установка элементов в пользовательском интерфейсе). Существует множество различных сайтов, на которых указан жаргон, но без справочного кода может быть трудно понять, что они означают. Я бы посоветовал погуглить С# для начинающих и найти учебник. Хорошие проведут вас с примерами кода. - person Dortimer; 07.05.2019
comment
Чтобы не звучало насмешливо или что-то в этом роде. Похоже, они действительно загнали вас в тупик, начав с доступом к данным так рано. - person Dortimer; 07.05.2019