2016-02-25 3 views
0

Я очень программист noobie, пытающийся написать небольшую часть программного обеспечения.C# Использование выбора ComboBox для PrePopulate TextBox's

В этом коде я пытаюсь предварительно заполнить текстовое поле в форме с подробной информацией из базы данных 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(); 
     } 
    } 
+1

естественно. После первоначальной декларации вы не присвоили ничего переменным. поэтому он всегда будет иметь значение по умолчанию 0. – Takarii

+1

В дополнение к этому ваш запрос будет возвращать 'PayrollNo' только когда вы используете' ExecuteScalar' – Takarii

+0

Не назначать ли я их после открытия соединения? – Josh

ответ

0

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(); 


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

     string Query = "SELECT TOP(1) PayrollNo, AnnualHolidayEntitlement, DaysTakenToDate FROM [Employee] WHERE FirstName" + "' '" + "LastName = @param"; 
     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.AddWithValue("@param", cbbEmployees.Text); 


      //GetAllcmd.ExecuteScalar(); use GetAllcmd.ExecuteReader() instead 
      OleDbDataReader oleDR; 
        oleDR = GetAllcmd.ExecuteReader(); 
        if (oleDR.HasRows) 
        { 
         txtPayrollNo.Text = oleDR["PayrollNo"].ToString(); 
         txtAHE.Text = oleDR["AnnualHolidayEntitlemet"].ToString(); 
         txtDTTD.Text = oleDR["DaysTakenToDate"].ToString(); 
         txtDaysRemaining.Text = (oleDR["AnnualHolidayEntitlemet"] - oleDR["DaysTakenToDate"]).ToString(); 

        } 


     } 
    } 
+0

Что делать, если запрос возвращает несколько строк? С запросом, как это, вы можете иметь несколько людей с тем же именем. не говоря уже о том, что параметры в этом случае полностью не нужны – Takarii

+0

takarii вы правы. BUt образец позволяет предположить, что первое и последнее имя достаточно, чтобы идентифицировать уникального человека. выбор должен быть таким, чтобы вы могли ожидать только одну запись в качестве результата. Если на другой стороне вход позволяет дублировать ввод одного и того же лица, которому нужно отделить, если у datareader имеется более одной записи в обработчике ошибок. – user1230268

+0

Никогда не делайте предположений. ОП сказал, что он новичок в этом, и его вопиющая ошибка в логике. Гораздо лучше обучить и обеспечить полное решение, чем позволить кому-то продолжать думать, что это хорошая идея. – Takarii

0

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

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

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

+0

Уже выработал ответ для этого приятеля, не может отметить его как ответ в течение 2 дней, спасибо за поддержку хоть! – Josh

+0

Вы можете принять ответ менее чем за 2 дня (> 15 минут) до тех пор, пока он не является вашим – Ian

+0

. Выберите верхнюю часть 1 не гарантирует правильную запись (не говоря уже о том, что вы не являетесь частью набора ключевых слов OleDB).Что, если Мэтт Смит - это имя, используемое несколько раз в базе данных? запрос в вашем ответе не учитывает это в малейшей степени. – Takarii

Смежные вопросы