Получить и отобразить данные вошедшего в систему пользователя в приложении ac # - PullRequest
1 голос
/ 10 мая 2019

Я создал приложение для входа / регистрации с C #, используя WPF и XAML. Когда пользователь входит в систему, я хочу отобразить некоторую информацию, которую он вводит в форму регистрации, но независимо от того, какой пользователь входит в систему, он всегда отображает информацию о последней зарегистрированной учетной записи. Как я могу заставить его отображать данные, основанные на текущем вошедшем в систему пользователе? Это код, который я смог собрать до сих пор.

Это страница, на которой я хочу, чтобы информация о пользователе отображалась (в виде текстовых блоков)

public partial class User_Homepage : Page
    {
        string connectionString = @"Data Source=HP;Initial Catalog=User_SignUpDB;Integrated Security=True;";

        public User_Homepage()
        {
            InitializeComponent();

            SqlConnection sqlCon = new SqlConnection(connectionString);
            sqlCon.Open();

            string query = "SELECT * FROM tblSignUP";
            SqlCommand createCommand = new SqlCommand(query, sqlCon);
            createCommand.Parameters.Clear();
            SqlDataReader dr = createCommand.ExecuteReader();
            while (dr.Read())
            {
                nameTxt.Text = (dr["StudentName"].ToString());

            }

            sqlCon.Close();   
        }
    }

Это код со страницы входа пользователя

private void UserSignInBtn_Click(object sender, RoutedEventArgs e)
        {
            SqlConnection sqlCon = new SqlConnection(@"Data Source=HP;Initial Catalog=User_SignUpDB;Integrated Security=True;");

            try
            {
                if (sqlCon.State == ConnectionState.Closed)
                {
                    sqlCon.Open();
                    string query = "SELECT COUNT (1) FROM tblSignUP WHERE StudentName=@StudentName AND Password=@Password";
                    SqlCommand sqlCmd = new SqlCommand(query, sqlCon);
                    sqlCmd.CommandType = CommandType.Text;
                    sqlCmd.Parameters.AddWithValue("@StudentName", tbID.Text);
                    sqlCmd.Parameters.AddWithValue("@Password", PB.Password);
                    int count = Convert.ToInt32(sqlCmd.ExecuteScalar());
                    if (count == 1)
                    {

                        // Custom Message Box and Dim Effect
                        var jim = new Dim();

                        jim.Show();
                        this.Effect = new BlurEffect();

                        var lsmb = new Custom_MessageBoxes.LoginSuccessfulMsgBox();
                        lsmb.ShowDialog();

                        this.Effect = null;
                        jim.Close();

                        //Move to User Homepage
                        var User_Homepage = new User_Homepage();
                        NavigationService.Navigate(User_Homepage);
                    }
                    else
                    {
                       // Custom Message Box and Dim Effect 2
                        var him = new Dim();

                        him.Show();
                        this.Effect = new BlurEffect();

                        var rmdlgb = new ReturnMessageDialogueBox();
                        rmdlgb.ShowDialog();

                        this.Effect = null;
                        him.Close();

                    }
                }
            }
            catch(Exception ex)
            {

            }
            finally
            {
                sqlCon.Close();
            }
        }

Это код страницы регистрации пользователя / создания новой учетной записи

using (SqlConnection sqlCon = new SqlConnection(connectionString))
                {
                    sqlCon.Open();
                    SqlCommand sqlCmd = new SqlCommand("UserAdd", sqlCon);
                    sqlCmd.CommandType = CommandType.StoredProcedure;                 
                    sqlCmd.Parameters.AddWithValue("@StudentName", tbStudentName.Text.Trim());
                    sqlCmd.Parameters.AddWithValue("@SchoolName", tbSchoolName.Text.Trim());
                    sqlCmd.Parameters.AddWithValue("@HouseName", tbHouseName.Text.Trim());
                    sqlCmd.Parameters.AddWithValue("@Prog", tbProg.Text.Trim());
                    sqlCmd.Parameters.AddWithValue("@PhoneNumber", tbPhoneNumber.Text.Trim());
                    sqlCmd.Parameters.AddWithValue("@Address", tbAddress.Text.Trim());
                    sqlCmd.Parameters.AddWithValue("@Password", pbPassword.Password.Trim());
                    sqlCmd.ExecuteNonQuery();

                    var dim = new Dim();
                    dim.Show();
                    this.Effect = new BlurEffect();

                    var cmb = new Custom_MessageBoxes.RegistrationComplete();
                    cmb.ShowDialog();

                    this.Effect = null;
                    dim.Close();
                    Clear();
                }

И вот хранимая процедура SQL, которую я использовал

USE [User_SignUpDB]
GO
/****** Object:  StoredProcedure [dbo].[UserAdd]    Script Date: 5/2/2019 5:46:43 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[UserAdd]
@StudentName varchar(50),
@SchoolName varchar(50),
@HouseName varchar(50),
@Prog varchar(50),
@PhoneNumber varchar(50),
@Address varchar(250),
@Password varchar(50)
AS
    INSERT INTO tblSignUp(StudentName,SchoolName,HouseName,Prog,PhoneNumber,Address,Password)
    VALUES (@StudentName,@SchoolName,@HouseName,@Prog,@PhoneNumber,@Address,@Password)

Итак, в конечном итоге я хочу отобразить StudentName, HouseName и Prog в соответствующих текстовых полях в зависимости от того, кто вошел в систему.

Ответы [ 3 ]

0 голосов
/ 10 мая 2019

Ваш вопрос является точной копией вашего предыдущего поста, который был закрыт. Это большой красный флаг для вас - вы должны понять, почему это произошло. SO довольно любезен, и закрытый вопрос означает, что сообщество думает, что вы можете добиться большего.

Итак, начнем. Во-первых, не используйте addwithvalue . Просто не надо. Чтобы быть вместе с этим, не будьте ленивым разработчиком - что-то поощряемое методами / функциями, такими как addwithvalue.

Далее у вас есть это:

        SqlCommand createCommand = new SqlCommand(query, sqlCon);
        createCommand.Parameters.Clear();

Почему? Вы создаете новый объект SqlCommand. Зачем вам нужно очистить параметры? Начните думать о своем коде и перестаньте слепо писать операторы, если вы не понимаете, что они делают. Если вы найдете код, который вы используете повторно, УЧИТЕ, что он делает, адаптируйте его к вашим собственным целям.

Далее мы видим, что вы получаете те же вопросы, на которые вы не ответили в предыдущей ветке. Ваше приложение должно «запомнить» данные пользователя, который входит в систему. И учтите, что способ входа пользователя в систему будет отличаться между существующим пользователем и новым пользователем. У вас есть 2 различных пути к коду, но в конечном итоге они должны делать одно и то же - предоставлять доступ пользователю и устанавливать информацию в вашем приложении, которая позволяет ему функционировать для того, кто вошел в систему.

Кроме того, никто, читающий ваш вопрос, не знает ваш уровень квалификации, ваши цели, вашу среду разработки или вашу рабочую ситуацию. Студент, изучающий первый язык, нуждается в ином уровне руководства, чем тот, у кого значительный опыт. Члену команды разработчиков необходим другой уровень (и он должен спрашивать членов команды перед публикацией). Если вы не предоставите никаких подсказок (или сообщите нам об этом явно), предложения и комментарии могут не иметь особого смысла. Они также могут показаться снисходительными. Публиковать вопросы на публичном форуме не так просто, как можно подумать. Научитесь задавать умные вопросы , которые побуждают других помогать.

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

Теперь вы можете подумать, что вы можете просто сохранить имя пользователя в каком-то месте после успешного входа в систему и просто получать его везде, где вам это нужно. Вы можете - но это очень неэффективный подход к разработке приложений. Зачем? Думаю об этом. Вы можете попробовать этот подход, но это не меняет необходимости запоминать минимальный набор регистрационной информации.

Итак, вернемся к предыдущему комментарию о двух путях кода. Ваша логика "существующего пользователя" просто проверяет, что имя пользователя / пароль существуют в строке в вашей таблице. Я буду игнорировать проблемы с хранением паролей в виде простого текста - вы не должны. И вы должны тщательно продумать, какая информация необходима для успешного входа в систему на основе естественного ключа таблицы. Имена часто не уникальны в школе, тем более между школами. Опять же - как опыт обучения эта конкретная деталь не слишком важна. Как код, который будет реализован в производственной системе, это очень важно.

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

0 голосов
/ 12 мая 2019

Согласно вашему коду, дизайн базы данных имеет много недостатков.Во-первых, вам нужен уникальный идентификатор для идентификации каждого человека.

Как я понял, вы используете "StudentName" для входа в систему, что является плохой практикой.Что делать, если у вас есть повторяющиеся имена?Поэтому вам нужен еще один уникальный столбец, помеченный как «имя пользователя», на который вы могли бы ссылаться при входе в систему.

Поэтому, когда вы изменили структуру таблицы, измените и запрос.

change --->string query = "SELECT COUNT (1) FROM tblSignUP WHERE StudentName=@StudentName AND Password=@Password";
до ---> string query = "SELECT COUNT (1) FROM tblSignUP WHERE username=@Username AND Password=@Password";

В дополнение к этому, на вашей домашней странице вы должны быть конкретны в отношении того, какую информацию запрашивать в БД.В настоящее время это ---> string query = "SELECT * FROM tblSignUP";
И его следует изменить на -> string query = "SELECT * FROM tblSignUP WHERE username = @Username";

0 голосов
/ 10 мая 2019

Всякий раз, когда пользователь входит в систему, у вас есть tbID.Text, вы можете сохранить эту переменную, и на домашней странице использовать ее следующим образом "SELECT * FROM tblSignUP WHERE studentName LIKE tbID.Text" (ofc вы не можете сделать это в точности так, вы должны сделатьправильное выражение SQL, но это так, как вы это делаете) вы можете в основном использовать тот же принцип, который вы используете в пользовательском журнале на странице.Это даст вам пользователя, которого вы только что вошли в систему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...