С# Использование выбора ComboBox для предварительного заполнения текстового поля

Я очень начинающий программист, пытающийся написать небольшое программное обеспечение.

В этом коде я пытаюсь предварительно заполнить текстовое поле в форме деталями из базы данных OleDB при новом выборе ComboBox.

По сути, щелчок по имени в ComboBox приведет к предварительному заполнению некоторых текстовых полей подробностями об этом имени.

Проблема в том, что код не присваивает значения из данных в текстовые поля. Вместо этого в текстовом поле отображается «0».

Как мне обойти это?

private void cbbEmployees_SelectedIndexChanged(object sender, EventArgs e)
    {
        int PayrollNo = 0;
        int AnnualHolidayEntitlemet = 0;
        int DaysTakenToDate = 0;

        string Query = "SELECT PayrollNo, AnnualHolidayEntitlement, DaysTakenToDate FROM [Employee] WHERE FirstName +  ' ' + LastName = ?";
        string ConnString = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\HoliPlanData.accdb;Persist Security Info=False";

        using (OleDbConnection conn = new OleDbConnection(ConnString))
        using (OleDbCommand GetAllcmd = new OleDbCommand(Query, conn))
        {

            conn.Open();
            GetAllcmd.Parameters.Add("?", OleDbType.VarChar).Value = cbbEmployees.Text;
            GetAllcmd.Parameters.Add("@PayrollNo", OleDbType.VarChar).Value = PayrollNo;               
            GetAllcmd.Parameters.Add("@AnnualHolidayEntitlement", OleDbType.VarChar).Value = AnnualHolidayEntitlemet;
            GetAllcmd.Parameters.Add("@DaysTakenToDate", OleDbType.VarChar).Value = DaysTakenToDate;
            GetAllcmd.ExecuteScalar();


            txtPayrollNo.Text = PayrollNo.ToString();
            txtAHE.Text = AnnualHolidayEntitlemet.ToString();
            txtDTTD.Text = DaysTakenToDate.ToString();
            txtDaysRemaining.Text = (AnnualHolidayEntitlemet - DaysTakenToDate).ToString();
        }
    }

person Josh    schedule 25.02.2016    source источник
comment
естественно. Вы ничего не присвоили переменным после первоначального объявления. поэтому он всегда будет иметь значение по умолчанию 0.   -  person Takarii    schedule 25.02.2016
comment
кроме того, ваш запрос будет возвращать только PayrollNo, когда вы работаете ExecuteScalar   -  person Takarii    schedule 25.02.2016
comment
Разве я не назначаю их после открытия соединения?   -  person Josh    schedule 25.02.2016
comment
нет. ваши параметры - это просто параметры. это не задания. Кроме того, они даже не используются в запросе, что означает, что он открыт для внедрения SQL. У вас тут половинчатая идея   -  person Takarii    schedule 25.02.2016
comment
Явно что-то не так, спасибо за помощь. Что бы я использовал вместо ExecuteScalar?   -  person Josh    schedule 25.02.2016
comment
И как мне назначить их на то, что я хочу?   -  person Josh    schedule 25.02.2016
comment
Какой параметр должен быть в вашем предложении WHERE? имя и фамилия разные столбцы? вы указываете, где несколько таких столбцов.   -  person Takarii    schedule 25.02.2016
comment
Давайте продолжим обсуждение в чате.   -  person Takarii    schedule 25.02.2016


Ответы (3)


https://stackoverflow.com/users/5292801/takarii

Благодаря обширному руководству от takarii ^^.. следующее рабочее решение вопроса!

    private void cbbEmployees_SelectionChangeCommitted(object sender, EventArgs e)
    {
        string Query = "SELECT PayrollNo, AnnualHolidayEntitlement, DaysTakenToDate FROM [Employee] WHERE PayrollNo =" + Convert.ToInt32(cbbEmployees.SelectedValue); 


        string ConnString = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\HoliPlanData.accdb;Persist Security Info=False";

        using (OleDbConnection conn = new OleDbConnection(ConnString))
        using (OleDbCommand GetAllcmd = new OleDbCommand(Query, conn))
        {
            DataTable dt = new DataTable();
            conn.Open();
            dt.Load(GetAllcmd.ExecuteReader());
            conn.Close();

             txtPayrollNo.Text = dt.Rows[0][0].ToString();
             txtAHE.Text = dt.Rows[0][1].ToString();
             txtDTTD.Text = dt.Rows[0][2].ToString();


        }
    }
person Josh    schedule 25.02.2016

мой пример кода использует данные первой найденной записи.

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

Если ваш набор результатов может состоять из более чем одной записи, вы должны обработать это через некоторое время (oleDR.Read()) { // сделать что-то }

person user1230268    schedule 25.02.2016
comment
Уже разработал ответ для этого приятеля, не могу пометить его как ответ в течение 2 дней, но спасибо за поддержку! - person Josh; 25.02.2016
comment
Вы можете принять ответ менее чем за 2 дня ( › 15 минут), если он не ваш - person Ian; 26.02.2016
comment
Выбор первого места не гарантирует правильную запись (не говоря уже о том, что он не является частью набора ключевых слов OleDB). Что, если имя Мэтта Смита используется в базе данных несколько раз? запрос в вашем ответе ни в малейшей степени не учитывает этого. - person Takarii; 26.02.2016

person    schedule
comment
Что делать, если запрос возвращает несколько строк? С таким запросом у вас может быть несколько людей с одним и тем же именем. не говоря уже о параметрах в данном случае совершенно ненужных - person Takarii; 25.02.2016
comment
Такари вы правы. НО образец позволяет предположить, что имени и фамилии достаточно, чтобы идентифицировать уникального человека. выбор должен быть таким, чтобы в результате можно было ожидать только одну запись. Если, с другой стороны, вход позволяет дублировать ввод одного и того же человека, вам нужно разветвиться, если у средства чтения данных есть более одной записи в обработчик ошибок. - person user1230268; 29.02.2016
comment
Никогда не делайте предположений. ОП сказал, что он новичок в этом, и это вопиющая ошибка в логике. Гораздо лучше обучить и предоставить полное решение, чем позволить кому-то продолжать думать, что это хорошая идея. - person Takarii; 29.02.2016